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

作者: East_wu | 来源:发表于2017-08-27 16:44 被阅读431次

    最近写了一个在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
    

    相关文章

      网友评论

        本文标题:请求参数预处理(pre-request)

        本文链接:https://www.haomeiwen.com/subject/hgxidxtx.html