引言
我们知道
1 | from flask import request |
是一个代理对象,实际上代理的是 RequestContext
的request
属性
1 | class RequestContext(object): |
那么request
属性又是什么什么呢?
原理与实现
1 | request = app.request_class(environ) |
request_class
定义如下
从上面代码可以看出来,request
是 request_class
的实例,request_class
是一个Request
类
定义在flask
的wrappers.py
中
1 | class Request(RequestBase, JSONMixin): |
mixin
是python
多继承的方式,从面向对象的语义来看,表达的是 has
关系而不是 is
关系,用于为子类提供一些额外的方法
相当于java
的interface
我们知道我们用的request
实际上是这个Request
的实例就好了
继承关系
我们重点看一下 JSONMixin
的实现
flask.wrappers.JSONMixin
1 | class JSONMixin(_JSONMixin): |
有一个 on_json_loading_failed
方法,他的作用是什么呢
on_json_loading_failed
作用
我们知道前后端以json
方式交互,对于前端传过来的数据我们要load
成字典,json.load(environ中前端传过来的json数据)
那么失败了就会调用这个函数
我们可以 继承Request
,写一个自定义的对象,重写这个方法,并赋值给Flask
类
1 | from flask import Flask, jsonify, Request |
这样,当load
失败后我们就可以自己决定该怎么办
值得注意的是,默认情况下,json.load
失败了会raise BadRequest
,结合flask
中的异常处理方式,我们也可以把他用 errorhandler
处理,例如@flask_app.errorhandler(BadRequest)
_JSONMixin
按两下 shift
搜索这个父类 _JSONMixin
,注意他是被重命名了,我们要搜索 JSONMixin
,只不过位置在 werkzeug
中
定义在 werkzeug
中
我们看到这个类有个一json
方法用于获取前端的json
数据。根据继承关系,我们可以
1 | from flask import request |
json_module
此外我们还看到两个 JSONMixin
都有 json_module
属性,属性值json
对象,这个json
是什么?是标准库的json
吗???
1 | class JSONMixin(_JSONMixin): |
查看 json
源码知道,这里json_module
属性的作用是指定了序列化反序列化的模块,这个json
不是标准库的,而是自定义的
位置在 flask.json
我们很容易在其中找到loads
等方法,注意到其中的_json
就是标准库的json
库,所以他是对标准库json
的封装
当然,我们也可以用自己的json
模块
例如你想不开想使用pickle
(跑路吧)
1 | class MyRequest(Request): |