美文网首页
装饰器-验证API入参

装饰器-验证API入参

作者: 木叶苍蓝 | 来源:发表于2020-01-09 15:28 被阅读0次

这里主要验证GET请求和POST请求

GET传参

GET把参数包含在URL中


get.png
POST传参

POST参数放到body中

post.png
进入主题wraps.py
#!/usr/bin/python
#-*- coding:UTF-8 -*-

import time
from flask import request
from functools import wraps

def request_data():
    if request.method in ("POST", "PUT"):
        return request.get_json(force=True)
    else:
        return request.value

def validate_params(required):
    '''
    check the input params
    :param required:
        type(list or tuple)
        item:
            :type(list or tuple)
            length should be >= 2
            item[0]: key name
            item[1]: key type
            item[2]: scope of key's value(not must)
        example:
            required = [(‘fence_name’, unicode), ('trigger_time', int), ('trigger_type', int, range(3)), ('action', int, (1,2))]
        :return
    '''
    def _validate_params(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            if not isinstance(required, (list, tuple)):
                raise TypeError, "The params required must be list!"
            for req in required:
                if len(req) < 2:
                    # Check the key is Exist:
                    try:
                        client_val = request_data()[req[0]]   
                    except:
                        return "Key = {} required param error".format(req[0]) 
                    client_val_type = req[1]
                    # Check the key's type:
                    if not isinstance(client_val, client_valu_type):
                        try:
                            client_val = client_val_type(client_val)
                        except ValueError, e:
                                return "Key = {} type error!".format(req[0])
                if len(req) >= 3:
                    if client_val not in req[2]:
                        return "Key = {} value = {} error!".format(req[0], client_val)
            val = f(*args, **kwargs)
            return val
        return wrapper
    return _validate_params

写一个超级简单的web程序my_appp.py

#!/usr/bin/python
#-*- coding:UTF-8 -*-

from flask import Flask

from wrap import request_data
from wrap import validate_params

app = Flask(__name__)

@app.route('/', methods=['GET'])
@validate_params(required=[('name', unicode), ('age', int, range(1, 100)), ('sex', int, [1, 2])])
def get():
    name = unicode(request_data().get("name"))
    age = int(request_data().get("age"))
    sex = int(request_data().get("sex"))
    return "name = %s, age = %s, sex = %s"%(name, age, sex)

@app.route('/', methods=['POST'])
@validate_params(required=[('name', unicode), ('age', int, range(1, 100)), ('sex', int, [1, 2])])
def post():
    name = unicode(request_data().get("name"))
    age = int(request_data().get("age"))
    sex = int(request_data().get("sex"))
    return "name = %s, age = %s, sex = %s"%(name, age, sex)
  
if __name__ == "__main__":
      app.run(host='0.0.0.0', port=5000, debug=True)

参数说明:

@validate_params(required=[('name', unicode), ('age', int, range(1, 100)), ('sex', int, [1, 2])])

@: python 语法糖
validate_params: 装饰器
required: 关键字参数,类型必须是list或者tuple
('name', unicode): 需要验证的变量名,类型必须是 unicode
('age', int, range(1, 100)): 需要验证的变量名,类型必须是int,并且1 <= age < 100
('sex', int, [1, 2]): 需要验证的变量名,类型必须是int,只能是 1 或者 2

相关文章

  • 装饰器-验证API入参

    这里主要验证GET请求和POST请求 GET传参 GET把参数包含在URL中 POST传参 POST参数放到bod...

  • 函数 三

    无参装饰器模板 有参装饰器模板 叠加多个装饰器

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Decorator装饰器

    1. 基本装饰器 1.1. 无参方法无参装饰器 1.2. 有参方法无参装饰器 利用(*args, **kwa...

  • 第四篇 闭包函数、装饰器、迭代器、序列化

    一、知识储备 二、闭包函数 三、简单装饰器 四、无参装饰器修订 五、无参装饰器之auth 六、有参装饰器 七、加多...

  • Python-迭代器

    一、装饰器 开放封闭原则 装饰器的简单实现 装饰器语法糖 装饰有参有返的函数 有参装饰器 wraps修改函数文档注...

  • 有参装饰器和不定长装饰器了解下

    有参装饰器: 不定长参数装饰器:

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • method_decorators用法

    装饰视图。用于API类在处理实际HTTP方法之前做相关数据处理,用户验证,日志记录等装饰器操作 使用方法: 在AP...

  • Node零基础入门到服务端程序 -- 第四章

    第四章 入参和验证入参 之前我们写了一个接口,把所有的书本数据都提供给了api,现在我们再写一个接口,通过丰富之前...

网友评论

      本文标题:装饰器-验证API入参

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