python - 仅对某些方法应用 Flask MethodView 装饰器

标签 python flask view python-decorators

我想知道是否有任何方法可以仅对类中的某些方法使用装饰器,例如在下面的代码中,我希望 token_required 装饰除 POST 之外的所有方法,如何我能实现这个目标吗?

class UserAPI(MethodView):
    def token_required(view_method):
        @wraps(view_method)
        def decorated(*args, **kwargs):
            token = None

            if 'token' in request.headers:
                token = request.headers['token']

            if not token:
                return "no token"

            return view_method(*args, **kwargs)

        return decorated

    decorators = [token_required]

    def get(self, user_id):
        if user_id is None:
            # return a list of users
            return "no user id"
        else:
            # expose a single user
            return "user id"

    def post(self):
        # create a new user
        return "create new user"

    def delete(self, user_id):
        # delete a single user
        return "delete user id"

    def put(self, user_id):
        # update a single user
        return "update user id"

最佳答案

这里有一些方法。

1)请求方法的条件添加到装饰器中:

@wraps(view_method)
def decorated(*args, **kwargs):
     if request.method == 'POST':
         # skip token processing - just result of view method 
         return view_method(*args, **kwargs)
     token = None # etc... (your code)

2) 为任何点创建一个通用的装饰器,并在没有装饰器属性的情况下使用他。

from functools import wraps

def token_required():
    def _token_required(f):
        @wraps(f)
        def __token_required(*args, **kwargs):
            token = None
            if 'token' in request.headers:
                token = request.headers['token']

            if not token:
                return "no token"

            return f(*args, **kwargs)
        return __token_required
    return _token_required

只需在需要 token 时添加到特定端点:

@token_required()
def get(self, user_id):
    ...

希望这有帮助。

关于python - 仅对某些方法应用 Flask MethodView 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58800880/

相关文章:

ios - 选项卡更改时 View 会更改大小

python - 我可以将标准输出重定向到某种字符串缓冲区吗?

python - : -c: line 1: syntax error near unexpected token `;'

python - 未使用 Flask-WTForms 设置 RECAPTCHA_PUBLIC_KEY 配置

javascript - Backbone : Using views inside _. 模板

java - 无法检索 JSON 值

python - 代码重复和性能之间的权衡

python - 使用通用数据源同步 QListWidget

python - 使用 Jinja2 模板标签时不呈现 Flask html

javascript - Flask:资源被解释为样式表但以 MIME 类型文本/html 传输