我想通过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
就像这样:
from myapp import app as application
if __name__ == '__main__':
application.run(debug=True, threaded=True)
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)
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
这实际上不起作用。在__init__.py
内,os.envrion
中没有'ENVTYPE'键。为什么不呢?
我也不知道如何修复if __name__ == '__main__'
部分,以便我可以在我的电脑上运行run.py
作为本地Flask应用。我在新run.py
中的内容有效,但只能通过调用_application
而不是包装函数application
。因此_application
无法访问我定义的环境变量。我该如何修理这条线?
谢谢!
答案 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问题。