Flask框架

RESTful架构设计

面向资源与使用URI表示资源的设计,这里资源与“状态”对立,所以是“无状态化”的设计。生产中常常希望后端程序是RESTful的,这可以充分的解耦前后端,实现前后端分离的开发与部署,并且由于服务端不记忆“状态”,而资源往往又是持久化的外部数据,所以RESTful天生支持分布式。

资源:用HTTP地址URI对应资源名词,并且利用好URI的树结构(比如 user/Jon/age)

动作:用HTTP方法作为对URI的操作动词(比如 DELETE user/6)

实现:JSON作为响应请求主体,kv型附加数据放入报头,响应状态用HTTP状态码描述,资源应设计的尽量“接近”数据库。业务实现有例如OAuth2认证,resource-based权限,多版本API上线等。

 

MVC框架

按抽象模块分层的设计,但通常是指实现了MVC设计的框架。其按模型Model、视图View、控制器Controller这三大模块拆分,其著名实现有SpringMVC等,是产业中最流行的框架。另外还有衍生的设计如MVVM、MTV等。

Model:数据的对象化,典型例子有RDBMS的ORM,其可以把表与表记录映射成类与对象。

View:模版引擎的HTML模版文件,模版引擎会把模版文件的位点动态替换为数据,生成本次响应的HTML。

Controller:处理HTTP的请求响应然后“转移”给相应业务逻辑,并且提供请求响应的拦截切面。

 

Python第三方组件

在使用Python开发后端程序时,应当根据PIP权重与更新频率选择ORM与WEB框架。下面就根据MVC来分层选择几个权威的有代表性的框架如下:

ORM模型:SQLAlchemy/Peewee。前者是企业级的框架,后者则轻量且用户体验好。基本思想是类对应一张表,对象对应某表一条数据。在类中可编写表结构声明以外的函数来延拓SQL逻辑,通过设计ORM数据模型可以避免数据库执行复杂SQL语句,甚至无需使用降低可用性的外键字段。另外ORM本身会对数据库的原子与事务性提供封装。

JSON序列化:Marshmallow。其使用类定义了字典/JSON的结构与限制。可直接对数据模型和请求正反序列化,无需编写代码校验字典/JSON。另外Peewee提供了Model转为字典或元组的函数,以及把数据库反射为字典的DataSet。

WEB框架:Flask等MVC微框架。微框架代码直观且学习平缓,与其他库完全解耦。

 

Flask框架:Quickstart

用Flask处理请求响应非常方便,用request/Response表示请求响应,用route表示资源/操作对应的函数即可把业务逻辑变成后端程序,另外提供了经典的拦截器钩子,以及对HTTP数据类型的支持如jsonify,send_file等等。可以先编写ORM与序列化类,再编写业务逻辑函数,最后放入Flask来实现解耦与MVC设计。

 

Flask框架:HTTP与WSGI

HTTP就是在TCP套接字传输处理文本报文或二进制流。py虽完整提供套接字与IO,但不应在该层处理HTTP,这应该被模块化。于是PEP的WSGI协议约定所有Web编程“最底层”入口的格式,但py自己没给WSGI程序。Flask的WSGI程序是自家Werkzeug,由于不同WSGI程序的接口应相同,所以Flask本身和Werkzeug解耦。常见WSGI程序还有uWSGI等。事实上生产环境WSGI的出口并非是socket(py性能问题),而是通过CGI等协议把响应数据传给Nginx等纯HTTP服务最后发送HTTP响应,所以WSGI程序内置的HTTP服务通常作为测试用途,不过WSGI也没约定所谓出口部分。下面看WSGI的唯一入口函数,这也是唯一的Web框架出口,例如Flask返回Response后的最后某一步就是调用这个函数。

 

Flask框架:上下文设计

在后端MVC程序中常常需要定义关于请求响应交互的上下文,这里的上下文与编程语言范畴的上下文无关,是一种抽象化类似编程语言上下文的接口。Flask设计了请求、会话、应用这三种上下文,上下文只需赋值即可实现相应功能。

1)请求上下文:request与g是请求生命周期的全局变量,Flask对请求上下文的设计不是通过把请求对象直接作为参数传入处理函数中,而是无论代码执行到哪里,只要引用request就可以取到该请求的传入数据,在请求的整个生命周期中,可以把生成的数据放到g的属性中供后续代码使用(好像也可以放到request)。

2)会话上下文:session是会话上下文,其数据类型是字典。其封装方式是用itsdangerous把session签名成token放在报文的Cookie。由于是通过token实现的,所以要配置相应密钥与过期时间。并且客户端Base64解码Cookie后就可以看到明文session的全部属性,所以设计session需要注意。

3)应用上下文:current_app是Flask实例的全局变量,即该实例所有请求的“全局变量”,但与Python全局变量的不同之处在于current_app被做了请求间的线程安全处理。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部