[英]Why can't Flask can't see my environment variables from Apache (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无法与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
,存在没有“ENVTYPE”键os.envrion
。 为什么不?
我也不知道如何解决if __name__ == '__main__'
部分,以便可以在PC run.py
作为本地Flask应用程序运行。 我在新的run.py
有效,但是只能通过调用_application
而不是wrapper函数application
。 结果, _application
无法访问我定义的环境变量。 我该如何解决?
谢谢!
由于这个技巧,我解决了问题#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)
我仍然没有解决问题2,但是-我不知道如何直接调用程序( if __name__ == '__main__'
)并可以访问ENVTYPE环境变量。 建议将不胜感激。 也许我将把这个问题分解成自己的StackOverflow问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.