请求参数预处理(pre-request)
2017-08-27 本文已影响431人
East_wu
最近写了一个在Flask框架下过滤请求参数的库。基本实现了参数类型转换,限定参数取值范围等功能。源代码可以在https://github.com/Eastwu5788/pre-request上进行下载。
处理内容
- 格式限制和转换处理,如果类型不符合或者无法转换成需求的类型,则抛出错误
- 取值范围限制,显示参数的取值内容的范围
- 字符串转义处理,防止SQL注入
- 请求参数为空和默认值处理,如果允许为空则可以设置默认值
用法介绍
-
在github上下载项目,将pre-request包导入到项目中
-
导入处理请求参数的装饰器
# 在Flask环境下
from pre_request.flask import filter_params
# 在Tornado环境下
from pre_request.tornado import filter_params
- 导入参数规则类(Flask、Tornado通用)
from pre_request.filter_rules import Rule, Length
- 设置参数过滤规则。过滤参数使用字典的形式,传递给调用函数。其中,字典的值是rule.py中的Rule()类的实例。在该实例中可以设置参数的具体过滤规则,比如是否允许为空、参数默认值、字符串长度等一系列属性。具体的属性可以参看Rule类的介绍
field = {
"age": Rule(direct_type=int, enum=[1, 2]),
"name": Rule(length=Length(6, 12)),
"email": Rule(email=True),
"mobile": Rule(mobile=True),
"empty": Rule(allow_empty=True, default="sssss_empty")
}
- 在请求处理函数之前,调用@filter_params()装饰器并传入上面的过滤参数,即可在请求发生时,自动过滤处理请求的参数。并讲处理后的参数放在请求处理函数的params字段中。
@app.route("/test", methods=['get', 'post'])
@filter_params(field)
def test_handler(params=None):
return str(params)
- 如果需要指定过滤get请求或者post请求的参数,可以在将请求参数放在get或者post字段中.
@app.route("/all", methods=['get', 'post'])
@filter_params(get=get_field, post=post_field)
def all_handler(params=None):
return str(params)
- 可以指定请求出错时的响应方式,包括JSON格式的响应或者HTML格式的响应。
@filter_params(get=get_field, post=post_field, response='html')
def dispatch_request(self, params=None):
return str(params)
- 也可以在rule.py中修改RESPONSE字段,更改默认情况下的响应方式
RESPONSE = JSONResponse("请求参数错误!", 500)
- 如果您想自定义自己的响应样式,可以继承BaseResponse类。具体可以参考JSONResponse类的实现
class JSONResponse(BaseResponse):
"""
以JSON格式响应出错的情况
"""
def __call__(self, handler=None, error=None, request_type=None):
"""
:type error: 错误
:param request_type: 请求类型
:return:
"""
result = super(JSONResponse, self).__call__(handler, error, request_type)
# Flask的处理
if self.request_type == RequestTypeEnum.Flask:
from flask import make_response
response = make_response(json.dumps(result))
response.headers["Content-Type"] = "application/json; charset=utf-8"
return response
# Tornado的处理
else:
self.handler.set_header("Content-Type", "application/json; charset=utf-8")
return self.handler.write(json.dumps(result))
Rule类参数介绍
# 当前字段是否允许为空
self.allow_empty = allow_empty
# 当前字段默认值,如果不允许为空,则次字段无意义
self.default = default
# 字段目标数据类型
self.direct_type = direct_type
# 字段枚举值,限定取值范围
self.enum = enum
# Email判断
self.email = email
# 手机号判断
self.mobile = mobile
# 字符串长度判断
self.len = length
# 字段是否是安全的,否则会进行转义,防止SQL注入
self.safe = safe