我目前正在开发一个网络应用,我正在使用Flask和Flask-User扩展来处理授权。目前我有这样的事情:
@application.route('/dummy')
@roles_required('Admin')
@login_required
def dummy():
在我的views.py
文件中,如下所示:
{% if current_user.is_authenticated and current_user.has_roles('Admin') %}
在我的模板中。
现在,有几次我在角色名称方面改变了主意,然后不得不搜索整个项目来查找和替换这些用法。我希望定义类似ADMIN_ROLE
全局的内容,可以在我的views.py
或任何模板中访问。我只要在想要更改角色的名称时更改配置文件。
我尝试使用我的config.py
设置ADMIN_ROLE = "Admin"
并撰写@roles_required(current_app.config['ADMIN_ROLE'])
,但这会给我以下错误:
RuntimeError: Working outside of application context. This typically means that you attempted to use functionality that needed to interface with the current application object in a way. To solve this set up an application context with app.app_context(). See the documentation for more information.
所以应该是错的。什么是完成我尝试的最正确的方法?
答案 0 :(得分:0)
正如它所说,您只能从应用程序上下文中访问配置。通常,你这样做:
with current_app.app_context():
admin_role = current_app.config['ADMIN_ROLE']
因为你是在装饰师那里做的,所以无论如何我都不相信这样做。我建议只使用一个单独的模块。现在,doesn't appear你可以在jinja中使用python import
语句,所以我们仍然会使用app.config
。基本上我们将创建一个具有所需角色的模块,然后将其导入配置文件和路径文件。
roles.py
ADMIN = "Admin"
USER = "User"
config.py
from roles import ADMIN, USER
ADMIN_ROLE = ADMIN
USER_ROLE = USER
routes.py
from roles import ADMIN, USER
@application.route('/dummy')
@roles_required(ADMIN)
@login_required
def dummy():
views.py
{% if current_user.is_authenticated and current_user.has_roles(app.config['ADMIN_ROLE']) %}