无法让自定义装饰器独立于订单工作

时间:2019-09-10 15:27:48

标签: flask-restplus

我的自定义装饰器在内置装饰器之前没有任何作用。

我有一个命名空间的子类,在这里我为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的正确方法是什么?

0 个答案:

没有答案