首页 > 解决方案 > 在烧瓶应用程序中注入配置后如何使用装饰器?

问题描述

首先我的项目是这样的:

├───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)

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

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

非常感谢您的帮助,如果不清楚,对不起,项目很大,很难同时清晰简洁。

标签: pythonflaskpython-requestsdecorator

解决方案


您可以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)

推荐阅读