我的自定义装饰器在内置装饰器之前没有任何作用。
我有一个命名空间的子类,在这里我为JWT身份验证定义了一个新的“授权”装饰器。装饰器执行一些身份验证检查,还为令牌参数和4xx响应添加其他装饰器。
## utils.py
import functools
from flask_restplus import Namespace as Namespace_
WRAPPER_ASSIGNMENTS = tuple(functools.WRAPPER_ASSIGNMENTS) + ('__apidoc__',)
class Namespace(Namespace_):
'''Some useful extensions of the framework namespace.'''
def authentication(self, *roles):
'''Decorator to require authentication.'''
_bearer = 'Bearer '
def _wrapper(func):
@self.response(403, 'Operation not allowed')
@self.response(401, 'Authorization required')
@self.param('Authorization', 'JWT Bearer token', _in='header')
def _actual_func(*args, **kwargs):
# TODO: check token
return func(*args, **kwargs)
functools.update_wrapper(_actual_func, func, assigned=WRAPPER_ASSIGNMENTS)
return _actual_func
return _wrapper
## companies.py
from flask_restplus import Resource
from train.apis.utils import Namespace
api = Namespace('companies', description='Company related operations')
@api.route('/')
class CompanyList(Resource):
@api.response(400, 'Test 1')
@api.authentication('ADMIN')
def get(self):
return {}
@api.authentication('ADMIN')
@api.response(400, 'Test 2')
def post(self):
return {}
运行此命令并查看swagger.json
时,“ get”条目具有所有三个4xx响应和标头参数,但是“ post”仅具有400响应。因此,我的新装饰师以某种方式做错了事,但似乎可以独立工作。我还尝试过在updated
上使用update_wrapper
参数并调用self.doc()(_actual_func)
。像这样扩展烧瓶restplus的正确方法是什么?