gpt4 book ai didi

python - Flask:验证 JSON 和 JSON Schema 的装饰器

转载 作者:太空狗 更新时间:2023-10-29 17:01:57 32 4
gpt4 key购买 nike

我有一个 Flask 应用程序,其调用需要 JSON 负载。在处理每个调用之前,我有一个两步错误检查过程:

  • 断言负载是一个有效的 JSON
  • 断言 JSON 负载符合特定模式

以下列方式实现:

@app.route('/activate', methods=['POST'])
def activate():
request_id = request.__hash__()

# Assert that the payload is a valid JSON
try:
input = request.json
except BadRequest, e:
msg = "payload must be a valid json"
return jsonify({"error": msg}), 400

# JSON Schema Validation
try:
validate(request.json, app.config['activate_schema'])
except ValidationError, e:
return jsonify({"error": e.message}), 400

由于这段代码在许多调用中重复,我想知道我是否可以优雅地将它移到装饰器中,形式为:

@validate_json
@validate_schema(schema=app.config['activate_schema'])
@app.route('/activate', methods=['POST'])
def activate():
....

问题在于 request 参数是隐式的:我可以在函数中引用它,但它不是函数的参数。因此,我不确定如何在装饰器中使用它。

如何使用 Python 装饰器实现验证检查?

最佳答案

只需在您的装饰器中使用全局的 request 上下文。它在任何请求期间均可用

from functools import wraps
from flask import (
current_app,
jsonify,
request,
)


def validate_json(f):
@wraps(f)
def wrapper(*args, **kw):
try:
request.json
except BadRequest, e:
msg = "payload must be a valid json"
return jsonify({"error": msg}), 400
return f(*args, **kw)
return wrapper


def validate_schema(schema_name):
def decorator(f):
@wraps(f)
def wrapper(*args, **kw):
try:
validate(request.json, current_app.config[schema_name])
except ValidationError, e:
return jsonify({"error": e.message}), 400
return f(*args, **kw)
return wrapper
return decorator

在应用@route 装饰器之前应用这些装饰器;你想注册包装函数,而不是路由的原始函数:

@app.route('/activate', methods=['POST'])
@validate_json
@validate_schema('activate_schema')
def activate():
input = request.json

关于python - Flask:验证 JSON 和 JSON Schema 的装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24238743/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com