【发布时间】:2019-08-22 01:38:06
【问题描述】:
我正在尝试调整 another StackOverflow answer 有条件地应用装饰器以仅需要登录特定环境(最终是 staging 环境,但 development 直到我得到这个工作)。为此,我从以下内容开始
auth = HTTPDigestAuth()
def login_required(dec, condition):
def decorator(func):
if not condition:
return func
return dec(func)
return decorator
@bp.route('/auth')
@login_required(auth.login_required, current_app.config['ENV'] != 'development')
def auth_route():
return current_app.config['ENV']
当我启动服务器时,我收到 RuntimeError: Working outside of application context 错误。在尝试了这个问题的早期版本的一些建议之后,我让 RuntimeError 消失了,但是当我想要的时候,装饰器仍然没有被正确应用。这是当前版本:
def login_required(dec):
def decorator(func):
if not os.environ.get('ENV') != 'development':
return func
return dec(func)
return decorator
@bp.route('/auth')
@login_required(auth.login_required)
def auth_route():
return current_app.config['ENV']
这永远不会返回 auth.login_reqired 函数。它总是让浏览器无需身份验证即可进入。
所以,我尝试将条件更改为
if not os.environ.get('ENV') is not None:
然后身份验证出现。
是的,我在 shell 中做了一个export ENV=development 并用env 命令确认了它。但即便如此,它也没有像我预期的那样读取环境变量。
也许这只是错误的做法?我的最终目标是要求在一个特定环境中进行身份验证。这可能与我正在走的路吗?有可能吗?
【问题讨论】:
-
您是否尝试将条件放入装饰器中?还要记住,对全局变量和函数名使用相同的名称并不是最好的主意。
-
@KonradSitarz 感谢您指出全局变量/函数名称冲突。我没有注意到。
标签: python flask flask-httpauth