一、Flask运行过程
1、当客户端想要获取资源时,一般会通过浏览器发起HTTP请求
2、此时,Web服务器会把来自客户端的所有请求都交给Flask程序实例
3、程序实例使用Werkzeug来做路由分发
4、根据每个URL请求,找到具体的视图函数并进行调用
5、Flask调用视图后,可以返回两种内容:字符串、HTML模板内容
二、Flask中WTF表单
WTForms支持的HTML标准字段:
StringField(文本字段)、IntegerField(文本字段,值为整数)、RadioField(一组单选框)、SelectField(下拉列表)、SubmitField(表单提交按钮)
使用Flask-WTF需要配置SECRET_KEY。
三、Flask中的session
1、数据库中的session,db.session.add()
2、flask_session扩展中的session,可以把信息存在服务器中,客户端浏览器只存储sessionid
3、flask自带的session,是一个请求上下文,把信息加密后存储在客户端浏览器cookie
四、Flask依赖的组件
Route(路由)、templates(模板)、Models(orm模型)、blueprint(蓝图)、Jinja2模板引擎
第三方组件:flask_bootstrap、flask-WTF、flask_sqlalchemy
五、Werkzeug与jinja2
Werkzeug:Werkzeug就Flask使用的底层WSGI库,Werkzeug 提供了 python web WSGI 开发相关的功能:
- 路由处理:如何根据请求 URL 找到对应的视图函数
- request 和 response 封装:提供更好的方式处理request和生成response对象
- 自带的 WSGI server:测试环境运行WSGI应用
Jinja2:Jinja2是基于python的模板引擎
六、Flask、Django、Tornado比较
Django:大而全的方向,开发效率高。它的MTV框架自带的ORM,admin后台管理,sqlite数据库和开发测试用的服务器
Flask:轻量级的框架,自由、灵活、可扩展性很强,核心基于Werkzeug WSGI工具和jinja2模板引擎
Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式
Tornado的两大核心模块:1.iostraem:对非阻塞式的socket进行简单的封装 2.ioloop:对I/O多路复用的封装,它实现了一个单例
七、请求上下文和应用上下文
请求上下文:保存了客户端和服务器交互的数据。(request、session)
应用上下文:Flask应用程序运行中,保存的一些配置信息,如程序名、数据库连接、应用信息等。(current_app、g)
八、Restful架构及设计
1、每个URL代表一种资源
2、客户端和服务器之间,传递这种资源的某种表现层
3、客户端通过四个http动词,对服务器资源进行操作,实现表现层状态转换
如何设计:
1、域名。将api部署到专用域名或主域名下
2、版本。将api版本号放到URL中
3、路径。路径表示api具体网址,网址中不能有动词只能有名词且名词要用复数。
4、使用标准的HTTP方法。GETPOSTPUTDELETE
5、过滤信息。如果资源过多,api应该提供参数,过滤返回结果
6、状态码。服务器向用户返回的状态码和提示信息。
7、错误信息。以键值对形式返回错误信息
九、Flask蓝图
蓝图是Flask应用程序组件化的方法,可以在一个应用内或跨越多个项目公用蓝图。使用蓝图可以极大简化大型应用的开发难度。
使用蓝图的三个步骤:
1、创建一个蓝图对象
2、在蓝图对象上操作,如注册路由、指定静态文件夹
3、在应用对象上注册这个蓝图对象
十、Flask请求钩子
1、before_first_request:在处理第一个请求前运行
2、before_request:在每次请求前运行
3、after_request:如果没有未处理的异常抛出,在每次请求后运行
4、teardown_request:即使有未处理的异常抛出,在每次运行后运行
十一、Flask与Django路由映射的区别
Django中路由是浏览器访问服务器时,先访问的项目中的URL,再由URL找到应用中URL,这些URL放在一个列表里,遵循从前往后匹配的规则。
Flask中路由通过装饰器给每个视图函数提供的,而且根据请求方式的不同可以一个URL用于不同的作用。
十二、MVC、MVT
M:模型,和数据库进行交互
V:视图,负责产生HTML页面
C:控制器,接受请求,进行处理,与M和V进行交互,返回应答
1、用户点击注册按钮,将信息发送给网站服务器
2、控制器接收到用户信息,会告诉Model层将信息保存到数据库
3、Model层将数据保存到数据库。数据保存之后结果会返回给Model模型,Model层将结果返回给控制器
4、控制器接收到保存结果之后,告诉View产生一个HTML页面。View将产生的页面返回给控制器
5、控制器将HTML内容返回给浏览器,浏览器进行解析展示
M:模型。
V:视图,同MVC中C
T:模板,同MVC中V
1、用户点击注册按钮,将信息发送给网站服务器
2、View接收到用户信息,会告诉Model将数据保存到数据库
3、Model层将数据保存到数据库。数据保存之后结果会返回给Model模型,Model层将结果返回给View
4、View接收到保存结果之后,告诉Template产生一个HTML页面。Template将产生的页面返回给View
5、View将HTML内容返回给浏览器,浏览器进行解析展示
十三、uWSGI和Nginx如何配合工作
WSGI是一种通信协议
uwsgi是一种线路协议
uWSGI是实现了uwsgi和WSGI两种协议的Web服务器
1、浏览器发起HTTP请求到Nginx服务器,Nginx接收到请求,进行URL分析,判断访问的资源类型
2、如果是静态资源,直接读取静态资源返回给浏览器
3、如果是动态资源交给uWSGI服务器,服务器根据WSGI和uwsgi协议,找到对应的Django框架,待框架下的应用进行逻辑处理之后,将返回值发送给uWSGI服务器,然后再返回给Nginx,最后又Nginx返回给浏览器进行渲染展示
十四、Celery分布式任务队列
用户发起Request,并等待Response返回。有的可能需要执行一段耗时的程序,那么用户就需要等待很长时间,如发送邮件、手机验证码。
使用Celery,将耗时的程序放到Celery中执行。