如何根据Flask中的服务器变量选择配置?

2024-04-19 17:40:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我在运行nginx+gunicorn+flask

我的nginx配置如下:

...

        proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header            Host $http_host;
        proxy_set_header            Stage "development";

        proxy_redirect off;

...

我的烧瓶应用程序看起来像:

^{pr2}$

但是

那似乎行不通。在

我得到一个:RuntimeError:在请求上下文之外工作

我的nginx被设置为可以有一个开发/生产环境,但是我想说这个“服务器位置”是一个开发环境,我希望Flask使用适当的配置。在


Tags: addhttphostflaskfor环境nginxproxy
2条回答

这有点旧,但我想补充一下我们是如何用烧瓶来完成这一点的。其中大部分是改编自http://flask.pocoo.org/docs/config/。在

在我们的配置.py我们定义了多个类(每个环境一个):

class Config(object):
    FOO = 1
    BAR = 2

class Development(Config):
    BAR = 3

然后,在我们的每个应用程序节点中,我们在gunicorn init脚本中设置一个环境变量(对于我们来说,它位于一个supervisor配置中,但不一定非得如此)。在

^{pr2}$

然后在初始化期间在flask应用程序中(仅在服务器启动时运行,而不是在请求上下文中运行):

try:
    env = os.environ['APPLICATION_ENV']
except KeyError as e:
    logging.error('Unknown environment key, defaulting to Development')
    env = 'Development'
    app.config.from_object('config.%s' % env)

现在应用程序配置['BAR']将是3。在

我们还需要对本地配置文件的支持(例如在开发人员机器上,或者直接从chef部署到机器上的密码,而不是存储在git中)。为此,我们在上面进行了扩展,还基于应用程序配置['LOCAL_CONFIG']参数。在

class Development(Config):
    BAR = 3
    LOCAL_CONFIG = '/etc/localConfig.py'

然后在/etc/本地配置.py在

BAR = 4

在我们的应用程序初始化代码中,在上面的代码加载初始应用程序配置对于环境:

if 'LOCAL_CONFIG' in app.config:
    #try to load the local configuration overrides
    if app.config.from_pyfile(app.config['LOCAL_CONFIG'], silent=True):
        logging.info('Loaded local config file at %s' % app.config['LOCAL_CONFIG'])
    else:
        logging.warning('Failed to load local config file at %s - does it exist?' % app.config['LOCAL_CONFIG'])

此时此刻应用程序配置['BAR']是4。在

这并不完美,因为如果配置中有dict,那么只能覆盖整个dict,而不能覆盖其中的键。但它确实完成了我们所需要的大部分。在

应用程序配置用于整个应用程序,而请求头仅用于一个请求。同一个应用程序通常处理许多请求。因此,您不能根据请求头设置配置。在

当没有请求到达应用程序时,模块级的代码在服务器启动时执行,因此没有当前的请求。这就是“在请求上下文之外工作”消息的含义。在

您要做的(prod vs.dev config)最好是在启动gunicorn服务器的脚本中使用一个环境变量。如果您想同时运行两个gunicorn服务器,最简单的方法就是运行两个gunicorn服务器。在

或者,创建两个应用程序对象,在同一个进程中运行它们,并使用类似于以下内容的WSGI中间件进行分派:http://flask.pocoo.org/docs/patterns/appdispatch/

相关问题 更多 >