#python #flask #python-decorators #flask-restx
Вопрос:
Я использую flask-restx для своих API.
(а) @namespace.expect(schema)
декоратор создает автоматическую документацию,
(б) и RequestParser
анализирует ввод запроса
вот код, который хорошо работает и достигает (а) и (б):
ns = api.namespace('my-api')
@ns.route('/my/api')
class MyApi(Resource):
schema = read_schema(schema_name)
@ns.expect(self.schema_model(schema_name, schema), validate=True)
def post(self):
parser = RequestParser()
parser.add_argument('aaa', type=inputs.datetime_from_iso8601)
parser.add_argument('bbb', type=int)
parser.parse_args()
do_something(args['aaa'], args['bbb'])
Чтобы предотвратить написание синтаксического анализатора для каждого api, я решил расширить flask_restx.Namespace
класс и добавить свой собственный декоратор, который будет:
(a) добавьте @expect
декоратор в функцию
(b) создайте синтаксический анализатор из схемы и добавьте проанализированные аргументы в post
функцию
вот реализация класса:
from flask_restx import Namespace
class RestNamespace(Namespace):
def schema(self, schema_name, parse=False):
schema_name = schema_name
schema = get_api_schema(schema_name)
parser = build_parser(schema)
def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
if parse:
req_args = parser.parse_args()
return f(*args, req_args, **kwargs)
return f(*args, **kwargs)
return wrapper
return self.expect(self.schema_model(schema_name, schema), validate=True)(decorator)
# -- usage -----:
ns = RestNamespace('my-api', api=api)
@ns.route('/my/api')
class MyApi(Resource):
@ns.schema(schema_name, parse=True)
def post(self, args):
do_something(args['aaa'], args['bbb'])
к сожалению, когда я это делаю, возврат self.expect(..)
в декораторе не дает результатов (документ не отображается), синтаксический анализ (функция оболочки) работает хорошо
если я заменю
return self.expect(self.schema_model(schema_name, schema), validate=True)(decorator)
с
return self.expect(self.schema_model(schema_name, schema), validate=True)
затем документ действительно появляется, но внутренняя оболочка, которая выполняет синтаксический анализ, не имеет никакого эффекта
Как правильно в одном декораторе обернуть данную функцию другим декоратором и изменить аргументы функций?