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

Geo*_*ams 5 python apache mod-wsgi environment-variables flask

我想通过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>
Run Code Online (Sandbox Code Playgroud)

基于对“ Apache SetEnv无法按预期与mod_wsgi一起工作 ”的答案,我已经进行了设置run.py,主要__init__.py是这样的:

旧的run.py:

from myapp import app as application

if __name__ == '__main__':
    application.run(debug=True, threaded=True)
Run Code Online (Sandbox Code Playgroud)

新的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)
Run Code Online (Sandbox Code Playgroud)

__init__.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
Run Code Online (Sandbox Code Playgroud)

两个问题

  1. 这实际上是行不通的。在其中__init__.py,没有'ENVTYPE'键os.envrion。为什么不?

  2. 我也不知道如何修复此if __name__ == '__main__'部分,以便可以run.py在PC上作为本地Flask应用程序运行。我在新run.py作品中放了什么,但是只能通过调用_application而不是wrapper函数application。结果_application是无法访问我定义的环境变量。我该如何解决?

谢谢!

Geo*_*ams 6

由于这个技巧,我解决了问题#1

请注意,Flask应用程序已导入def应用程序块内-如果将其导入到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)
Run Code Online (Sandbox Code Playgroud)

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