flask开发中几种接口参数验证的技巧

我们在flask开发中会经常遇到接口上需要做参数验证的情况,有时候有很多接口都有很多同样的必填参数需要进行验证,那么我们可以使用一些技巧对这些参数进行统一验证,这样让接口中的代码更加简洁,我们来看下如何撰写这类代码

1.使用自定义函数进行参数的集中验证

我们先定义验证函数
def validata_params(data, params):
	errors = []
	for param in required_params:
        if param not in data or data[param] in (None, ""):
            errors.append(f"必填参数: {param}")
    return errors

然后可以在接口中使用验证函数对参数进行验证

@app.route('/api', methods=['POST'])
def api():
    data = request.get_json()
    params = ["title", "category", "post_time", "content"]
    if errors := validate_params(data, params):
        return jsonify({"errors": errors}), 400
    #一些自己的逻辑
    return jsonify({"success": True})

2.使用装饰器来验证参数

我们先来定义个装饰器
from functools import wraps

def validata_params(params):
    def decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            data = request.get_json()
            errors = [p for p in params if p not in data or not data[p]]
            if errors:
                return jsonify({"error": f"参数验证失败: {', '.join(missing)}"}), 400
            return f(*args, **kwargs)
        return wrapper
    return decorator

然后使用装饰器装饰接口

@app.route('/api', methods=['POST'])
@validata_params(["title", "category", "post_time", "content"])
def api():
    data = request.get_json()
	#直接return,如果参数有问题装饰器会直接拦截
	#一些自己的逻辑
    return jsonify({"Success": True})

3.使用Marshmallow库进行复杂验证

这个库需要单独安装

pip install marshmallow
安装好以后我们先需要创建一个验证类
class ItemSchema(Schema):
    title = fields.Str(required=True)
    category = fields.Int(required=True)
    post_time = fields.Int(required=True)
    content = fields.Raw(required=True)

使用方法如下

@app.route('/api', methods=['POST'])
def api():
    try:
        data = ItemSchema().load(request.json)
    except ValidationError as err:
        return jsonify({"errors": err.messages}), 400
    #一些自己的逻辑
    return jsonify({"Success": True})

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/1123

评论列表

0%