Flask - 如何正确设置全局值

时间:2017-05-13 20:47:11

标签: python flask global-variables

我目前正在开发一个网络应用,我正在使用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.

所以应该是错的。什么是完成我尝试的最正确的方法?

1 个答案:

答案 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']) %}