Python程序猿阵线联盟-汇总各类技术干货

请求参数预处理(pre-request)

2017-08-27  本文已影响431人  East_wu

最近写了一个在Flask框架下过滤请求参数的库。基本实现了参数类型转换,限定参数取值范围等功能。源代码可以在https://github.com/Eastwu5788/pre-request上进行下载。

处理内容

  1. 格式限制和转换处理,如果类型不符合或者无法转换成需求的类型,则抛出错误
  2. 取值范围限制,显示参数的取值内容的范围
  3. 字符串转义处理,防止SQL注入
  4. 请求参数为空和默认值处理,如果允许为空则可以设置默认值

用法介绍

  1. 在github上下载项目,将pre-request包导入到项目中

  2. 导入处理请求参数的装饰器

# 在Flask环境下
from pre_request.flask import filter_params

# 在Tornado环境下
from pre_request.tornado import filter_params
  1. 导入参数规则类(Flask、Tornado通用)
from pre_request.filter_rules import Rule, Length
  1. 设置参数过滤规则。过滤参数使用字典的形式,传递给调用函数。其中,字典的值是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")
}
  1. 在请求处理函数之前,调用@filter_params()装饰器并传入上面的过滤参数,即可在请求发生时,自动过滤处理请求的参数。并讲处理后的参数放在请求处理函数的params字段中。
@app.route("/test", methods=['get', 'post'])
@filter_params(field)
def test_handler(params=None):
    return str(params)
  1. 如果需要指定过滤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)
  1. 可以指定请求出错时的响应方式,包括JSON格式的响应或者HTML格式的响应。
@filter_params(get=get_field, post=post_field, response='html')
    def dispatch_request(self, params=None):
        return str(params)
  1. 也可以在rule.py中修改RESPONSE字段,更改默认情况下的响应方式
RESPONSE = JSONResponse("请求参数错误!", 500)
  1. 如果您想自定义自己的响应样式,可以继承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
上一篇下一篇

猜你喜欢

热点阅读