2012-08-03 57 views
1

我運行的nginx + gunicorn +瓶如何根據Flask中的服務器變量選擇Config?

我的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; 

... 

我的瓶的應用程序是這樣的:

​​

然而,

不似乎工作。

我得到一個:RuntimeError:請求上下文之外的工作

我nginx的是設置這樣我就可以有一個開發/生產環境,但我希望能夠說,這個「服務器位置」是開發環境,我希望Flask使用適當的配置。

回答

4

應用程序配置用於整個應用程序,而請求標頭僅用於一個請求。同一個應用程序通常處理很多請求。因此,您不能根據請求標題設置配置。

您的代碼在模塊級別在服務器啓動時執行,當沒有請求到達應用程序時,所以沒有當前的請求。這是「在請求上下文之外工作」消息的意思。

你想要做的事情(prod vs. dev config)最好在啓動gunicorn服務器的腳本中使用環境變量完成。如果你想讓兩者同時最簡單的就是運行兩個gunicorn服務器。

或者,使兩個應用的對象,無論是在同一個進程中運行它們,並與類似的這些一個WSGI中間件分派:http://flask.pocoo.org/docs/patterns/appdispatch/

+0

http://flask.pocoo.org/docs/config/#development-production – zengr 2014-04-19 22:33:17

1

這是一個有點老,但我想補充,我們如何做到這一點與瓶。其中大部分改編自http://flask.pocoo.org/docs/config/

在我們config.py我們定義多個類(每一個環境):

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

class Development(Config): 
    BAR = 3 

然後我們在每個應用程序節點的設置,我們在gunicorn init腳本環境變量(對於我們這種生活中的管理員配置,但它不一定是)。

environment=APPLICATION_ENV='Development' 

接着在初始化期間將燒瓶應用(只運行在服務器啓動,而不是請求上下文內):

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) 

現在的app.config [ 'BAR']將3

我們還希望支持本地配置文件(例如,在開發人員機器上或從廚師直接部署到機器並且不存儲在git中的密碼)。要做到這一點,我們已經擴展了上面的內容,以根據app.config ['LOCAL_CONFIG']參數加載本地配置。

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

然後在/ etc/localConfig中。PY

BAR = 4 
在我們的應用程序的初始化代碼

後再次上面的代碼加載初始的app.config適用環境:

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']) 

此時的app.config [ 'BAR']爲4。

這並不完美,因爲如果你的配置中有字典,你將只能覆蓋整個字典,而不是其中的關鍵字。它確實完成了我們需要的大部分。