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是这样的:
from myapp import app as application
if __name__ == '__main__':
application.run(debug=True, threaded=True)
Run Code Online (Sandbox Code Playgroud)
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)
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)
这实际上是行不通的。在其中__init__.py,没有'ENVTYPE'键os.envrion。为什么不?
我也不知道如何修复此if __name__ == '__main__'部分,以便可以run.py在PC上作为本地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)
Run Code Online (Sandbox Code Playgroud)
我仍然没有解决问题2,但是-我不知道如何直接调用程序(if __name__ == '__main__')并可以访问ENVTYPE环境变量。建议将不胜感激。也许我将把这个问题分解成自己的StackOverflow问题。
| 归档时间: |
|
| 查看次数: |
4246 次 |
| 最近记录: |