封装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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是改进后的代码,主要包括以下几个方面: 1. 增加注释和异常处理,提高代码可读性和健壮性。 2. 将重复代码封装成函数,减少代码量并提高可维护性。 3. 使用 f-string 格式化字符串,提高代码可读性。 改进后的代码如下: ```python from flask import Flask, request, jsonify, abort import subprocess app = Flask(__name__) WEBHOOK_VERIFY_TOKEN = 'your_token_here' pyfile = 'path/to/your/python/script.py' def verify_token(): """验证 token 是否正确""" token = request.headers.get('X-Gitlab-Token') if token != WEBHOOK_VERIFY_TOKEN: abort(401) def handle_merge(project_id, project_name, ref, commit_id, modified): """执行合并处理""" retcode = subprocess.call(f'python3.5 {pyfile} "{project_id}" "{project_name}" "{ref}" "{commit_id}" "{modified}"', shell=True) if retcode != 0: abort(503) @app.route('/', methods=['GET', 'POST']) def webhook(): if request.method == 'GET': verify_token() return jsonify({'status': 'success'}), 200 elif request.method == 'POST': verify_token() data = request.get_json() project = data.get('project') commits = data.get('commits') if not all([project, commits]): abort(400) project_id, project_name, project_git_http_url = project.get('id'), project.get('name'), project.get('git_http_url') ref, commit_id, modified = commits[0].get('id'), commits[0].get('modified') handle_merge(project_id, project_name, ref, commit_id, modified) return jsonify({'status': 'success'}), 200 else: abort(400) ``` 需要注意的是,由于使用了 subprocess 执行命令,存在一定的安全风险,建议对命令参数进行校验和过滤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值