【问题标题】:How to use decorator after config was injected in flask app?在烧瓶应用程序中注入配置后如何使用装饰器?
【发布时间】:2019-08-10 00:56:38
【问题描述】:

首先我的项目是这样的:

├───api
│   ├───config
│   │   └───config.json
│   ├───namespace
│   │   └───routes.py
│   └───auth.py (where the decorator is)
│   │   
│   └───__init__.py (where the config is injected with flask injector)
├───core
    └───example_service.py

我一直在尝试重构烧瓶应用程序上的一些现有代码,以避免在代码中硬写验证 url。这个想法是创建一个装饰器 @authorize 在应用程序的每个路由处理程序上使用,以检查请求标头 Authorization 是否已设置并正常工作。

现在装饰器看起来像这样:

def authorize(func):
    def decorator(*args, **kwargs):
        get_token_info()
        return func(*args, **kwargs)
    return decorator

验证函数如下所示:

def get_token_info():
    session = requests.Session()
    res = session.get('my_auth_url', headers={'Authorization' : request.headers['Authorization']}
    if r.status_code != requests.codes.ok:
        abort(401)

现在,我的应用程序有一个 init 文件,我在其中使用烧瓶注入器将应用程序的配置注入不同的服务类中。问题是,我还想注入 'my_auth_url' 而不是直接将其写入代码中。但似乎烧瓶注入器只能注入到类中。

我尝试使用烧瓶全局上下文使 url 在应用程序中的任何地方都可以访问,但我发现这不是它的目的,我真的不知道该怎么做。 (实际上我是 python 新手)

非常感谢您的帮助,不清楚的地方见谅,项目很大,很难同时清晰简洁。

【问题讨论】:

    标签: python flask python-requests decorator


    【解决方案1】:

    您可以从环境变量中获取my_auth_url 值。

    def get_token_info():
        my_auth_url = os.getenv('AUTHORIZATION_SERVICE_ENDPOINT')
        session = requests.Session()
        res = session.get(my_auth_url, headers={'Authorization' : request.headers['Authorization']}
        if r.status_code != requests.codes.ok:
            abort(401)
    

    【讨论】:

    • 感谢您的回答,我正在使用请求,因为我需要向我的身份验证服务发送请求以检查用户令牌是否有效。
    • 他的意思是,flask 方法将收到一个请求(对象,而不是库),该请求已经包含您要查找的内容,因此请求(库不是对象)可能不正确
    • 所以,我建议您从环境变量中获取“my_auth_url”值。你可以使用os.getenv('KEY', 'DEFAULT_VALUE')
    • 现在你需要配置服务器环境来满足这个要求。
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2012-07-14
    • 2021-12-10
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    相关资源
    最近更新 更多