我们在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
评论列表