为什么Flask无法从Apache(mod_wsgi)中看到我的环境变量?

时间:2016-07-14 21:19:24

标签: python apache flask environment-variables mod-wsgi

我想通过Apache + mod_wsgi传递环境变量来告诉我的应用程序它是在运行环境还是生产环境中运行。 (这需要在应用程序启动之前,在任何请求进入之前发生。)例如:

<VirtualHost *:80>
    ...
    SetEnv ENVTYPE production
    WSGIScriptAlias /myapp  /apps/www/80/wsgi-scripts/myapp/run.py
</VirtualHost>
<VirtualHost *:8080>
    ...
    SetEnv ENVTYPE development
    WSGIScriptAlias /myapp  /apps/www/80/wsgi-scripts/myapp/run.py
</VirtualHost>

根据“Apache SetEnv not working as expected with mod_wsgi”给出的答案,我设置了run.py,主__init__.py就像这样:

旧run.py:

from myapp import app as application

if __name__ == '__main__':
    application.run(debug=True, threaded=True)

新的run.py:

import os
from myapp import app as _application

def application(environ, start_response):
    os.environ['ENVTYPE'] = environ['ENVTYPE']
    return _application(environ, start_response)

if __name__ == '__main__':
    _application.run(debug=True, threaded=True)

__初始化__。PY

app = Flask(__name__)
app.config.from_object(__name__)
if os.environ.get('ENVTYPE') == 'production'
    # Setup DB and other stuff for prod environment
else:
    # Setup DB and other stuff for dev environment

两个问题

  1. 这实际上不起作用。在__init__.py内,os.envrion中没有'ENVTYPE'键。为什么不呢?

  2. 我也不知道如何修复if __name__ == '__main__'部分,以便我可以在我的电脑上运行run.py作为本地Flask应用。我在新run.py中的内容有效,但只能通过调用_application而不是包装函数application。因此_application无法访问我定义的环境变量。我该如何修理这条线?

  3. 谢谢!

1 个答案:

答案 0 :(得分:5)

由于this tip

,我解决了问题#1
  

请注意,Flask应用程序是在def应用程序块中导入的 - 如果您在此块之外导入它,您将无法在Flask应用程序级别或任何导入的文件中使用环境变量应用程序负载这是因为在导入Flask应用程序时没有加载WSGI应用程序,因此它无法传递环境变量。

所以run.py的工作版本是:

import os

def application(environ, start_response):
    os.environ['ENVTYPE'] = environ['ENVTYPE']
    from myapp import app as _application
    return _application(environ, start_response)

if __name__ == '__main__':
    _application.run(debug=True, threaded=True)

我仍然没有解决问题#2,但是 - 我不知道如何直接调用该程序(if __name__ == '__main__')并且可以访问ENVTYPE环境变量。建议仍然会受到赞赏。也许我会把这个问题分解成自己的StackOverflow问题。