【问题标题】:How do I dynamically decorate a Flask rule?如何动态装饰 Flask 规则?
【发布时间】:2017-06-02 02:37:57
【问题描述】:

我有一个包含大量自动定义规则的应用程序。在继续之前,我需要每条规则来检查 Bearer 令牌。

我找到了app.url_map.iter_rules(),它确实让我看到了所有定义的规则。我想要一种方法来重新定义每个规则以使用其当前功能,但使用下面定义的 authenticate_admin 装饰器包装它。

from flask import Flask
from functools import wraps

app = Flask(__name__)

# Check that the request has the correct `bearer_token`.
def authenticate_admin(func):
    @wraps(func)
    def wrapped(*args, **kwargs):
        bearer_token = vault.get('secret/oauth')['bearer_token']
        expected = ("Bearer " + bearer_token)
        if expected != request.headers.get('Authorization'):
            return jsonify({'error': "Authorization token incorrect"}), 401

        return func(*args, **kwargs)
    return wrapped


# .... Define a bunch of routes (Elided) .... 

for rule in app.url_map.iter_rules():
    # NEXT LINE IS PSEUDOCODE; IT IS WHAT I WANT TO ACHIEVE
    rule.fx = authenticate_admin(rule.fx)

我想要的是,在上述 for 循环执行后,所有规则现在都要求您提供 Bearer 令牌。

【问题讨论】:

    标签: python google-app-engine flask decorator


    【解决方案1】:

    最后,我只是按照大卫主义的建议添加了 authenticate 一个由所有端点运行的函数。我添加了需要身份验证的端点白名单。

    from flask import request
    import vault
    
    app = Flask(__name__)
    
    # .... Define a bunch of routes (Elided) .... 
    
    
    WHITELIST_POST = ['/post1', '/post2', '/post3']
    
    
    WHITELIST_GET = ['/', '/get1', '/get2']
    
    
    def authenticate():
        if request.method == "GET" and request.url_rule.rule in WHITELIST_GET:
            return
        if request.method == "POST" and request.url_rule.rule in WHITELIST_POST:
            return
        bearer_token = vault.get('secret/oauth')['bearer_token']
        expected = ("Bearer " + bearer_token)
        if expected != request.headers.get('Authorization'):
            abort(401)
    
    app.before_request(authenticate)
    

    顺便说一句,我的老板更喜欢这个。这意味着我们默认在服务器上创建的任何端点都需要一个不记名令牌。过去,我们忘记了某些端点需要不记名令牌。现在它是选择退出而不是选择加入。

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2017-12-13
      • 1970-01-01
      • 2012-12-05
      • 2021-04-09
      • 2017-06-19
      • 1970-01-01
      • 2018-12-30
      • 2020-07-15
      相关资源
      最近更新 更多