flask处理http请求的数据
一般来说, 现在的python应用服务器遵从wsgi协议, flask的app获取gunicorn的environ, start_response参数, 然后处理, 抓包gunicorn发过来的environ数据如下:
1 | { |
在flask中, 想获取前端的数据大概有三种方式, 在Request类中有描述:
- request.args()
- url中query部分字段
- request.form()
- request.data
- request.json()
request.args
这个方法主要获取请求url中的query字段, 在flask的Request.args方法中提取environ的QUERY_STRING字段进行解析, 具体实现位于werkzeug.wrappers.base_request/BaseRequest中.
request.form
这个字段获取form表单的数据, 一般来说, http通过post或者put方法发送form数据, 然后定义Content-Type字段决定如何解析form数据:
application/x-www-form-urlencoded
数据被编码成以&分隔的键值对, 同时以 ‘=’ 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替).
1 | POST / HTTP/1.1 |
multipart/form-data
一般上如果长传文件或者大的数据的话用这种方法, 因为上面的方法会对不安全的字符进行编码,
1 | POST /test.html HTTP/1.1 |
flask解析的实现
flask对form数据的解析是在werkzeug.formparser.FormDataParser中实现的, 对不同的Content-Type提供不同的解析方法:
1 | parse_functions = { |
request.json()
现在一般都用json做前后端交互的格式, 看下lfaks的json解析过程, flask的json解析存在于JSONMixin.get_json()这个方法中, 先调用is_json查询mimetype是不是application/.*json, 如果是, 那么获取请求的data然后尝试调用json.loads方法解析数据成json格式, 如果不是, 直接返回None.