封装request.get_params批量取值

@json_request_validator(post_schema) 装饰器
from functools import wraps
from schema import SchemaError

def json_request_validator(schema):
    """
    ***校验请求中携带的Json格式***

    1. 提取客户推送的数据,将其转化成json
    2. 按照schema对json进行校验和转换, 未通过就抛出相应的异常, 异常参见
    3. 添加get_params(*params)方法, 用于批量获取转换后的json参数
    4. 完成view的原有操作
    """
    def decorator(func):
        """
        装饰器
        """

        def inner_decorator(view, *args, **kwargs):
            """
            **装饰器内部逻辑实现**
            """
            try:
                args_dict = json.loads(view.request.body.decode('utf-8'))
                api_logger.info(args_dict)
            except Exception:
                return JsonResponse(dict(
                    msg='请传递Json格式的数据',
                    code=ARGUMENT_INVALID,
                    data={}
                ))
            try:
                args_dict = schema.validate(args_dict)
            except SchemaError as ex:
                return JsonResponse(dict(
                    msg=str(ex),
                    code=ARGUMENT_INVALID,
                    data={}
                ))

            setattr(view.request, 'get_params',
                    lambda *arg_items: [args_dict.get(arg) for arg in arg_items])

            return func(view, *args, **kwargs)

        return wraps(func)(inner_decorator)
    return decorator
from schema import Schema, Use, Optional

class ProductView(APIView):
   
    post_schema = Schema({
        'barcode': Use(str, error='barcode required'),
        'store_code': Use(str, error='store code required'),
        'come_from': Use(str, error='from required'),
        Optional('quantity'): Use(int, error="params quantity require int"),
        Optional('user_id'): Use(int, error='params user id require int'),})

    @json_request_validator(post_schema)
    def post(self, request):
        barcode, store_code, come_from, quantity, user_id = request.get_params('barcode', 'store_code', 'come_from', 'quantity', 'user_id')
原文地址:https://www.cnblogs.com/hanbowen/p/10080515.html