MVC架构(vc++的MFC、Java的structs和Srping、C#的.net)

  • 模型(Model)

    封装应用业务逻辑对数据的处理,Model只提供功能性的接口,通过调用接口获取Model的功能

  • 视图(View)

    呈现数据给用户,通常一个Model为多个View提供服务

  • 控制器(Controller)

    收集用户输入提供给Model

三个组成部分分离开来,在改进代码和升级时不会相互影响。

两个主要依赖:

1、Werkzeug是WSGI的工具包(Web Server GatewayInterface)提供路由、调试、和服务器网关接口,利用该库实现socket服务端

2、Jinja2提供模板系统

Flask特点

  • 轻量化、灵活性,内置开发服务器和调试器,无需安装其他网络服务器,flask默认处于调试状态,分别像Console和HTTP发送反馈报错信息
  • 基于Unicode编码,默认UTF-8编码,无需担心编码问题
  • 使用Jinja2,是一个灵活自由高效的Html模板技术,有利于模板继承、修改或维护

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from flask import Flask

app = Flask(__name__)

#Django路由使用为
#urls.py path("/",视图)
#def index()
@app.route('/')
def hello_flask():
return 'hello wolrd'

if __name__ == "__main__":
app.run()
#默认情况下为调试模式,不允许外部客户端访问,想要开放访问时在run()方法里设置
#app.run(host='0.0.0.0', post=80, debug=False)
#开启debug方便开发时期调试,可以显示具体报错

>>> Serving Flask app "flask__" (lazy loading)
>>> * Environment: production
>>> WARNING: This is a development server. Do not use it in a production deployment.
>>> Use a production WSGI server instead.
>>> * Debug mode: on
>>> * Restarting with windowsapi reloader
>>> * Debugger is active!
>>> * Debugger PIN: 150-593-593
>>> * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

render_template实现模板渲染

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from flask import Flask
from flask import render_template

app = Flask(__name__)


#通过route()装饰器绑定到多个url上面
#html文件保存在根目录下的templates中
@app.route('/hello/')
@app.route('/hello/<name>/')
def hello(name=None):
return render_template('1.html',name=name)

if __name__ == "__main__":
app.run(debug=True)

1
http://127.0.0.1:5000/hello/anthor/通用渲染成功

重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route('/')
def index():
return redirect('/error')
#访问根路径重定向到error

@app.route('/error')
def cheks():
abort(404)
#向客户端返回404zhuangtaima

if __name__ == "__main__":
app.run(debug=True)

也可以通过errorhandler()自定义错误页面

1
2
3
@app.errorhandler(404)
def error_page(error):
return render_template("error.html"),404

路由

1
2
3
4
5
6
7
8
9
10
11
@app.route('/login/<username>/')
def index(username): #此处声明的变量要与路径中的变量名一致
return '{} is login'.format(username)

@app.route('/login/<path:paths>/')
def index(paths): #此处声明的变量要与路径中的变量名一致
return '{} is login'.format(paths)

@app.route('/login/<int:id>/')
def index(id): #此处声明的变量要与路径中的变量名一致
return '{} is login'.format(id)

路由器变量映射有三种,一种为默认path接收路径和字符串,第二种是int型,第三种是float

声明方式 访问url 可否访问
@app.route(‘/login/‘) http://127.0.0.1:5000/login/ ok
http://127.0.0.1:5000/login ok
@app.route(‘/login’) http://127.0.0.1:5000/login/ no
http://127.0.0.1:5000/login ok

访问方式

1
2
3
4
5
6
7
@app.route('/login/',methods=['POST'])
def index():
print('POST')

@app.route('/login/',methods=['GET'])
def geis():
print('GET')

回调接入点

before_request

​ 请求任何url前调用该接入点,如果在该接入点return任何东西,flask就会停止调用,把该接入点的响应返回给 客户端

after__request

​ 在url被调用之后调用该接入点,可以用来检查处理调用之前生成的response或是修改。

teardownafter__request

​ 在url被调用之后调用该接入点,可以用来检查处理调用之前生成的response或是修改。与after__request不同 在于发生异常后仍然会调用该接入点,可以用来做异常处理