gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:32:48 24 4
gpt4 key购买 nike

我想通过 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)

__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

两个问题

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

  2. 我也不知道如何修复 if __name__ == '__main__' 部分,以便我可以将 run.py 作为本地 Flask 运行我的电脑上的应用程序。我在新的 run.py 中放入的内容可以正常工作,但只能通过调用 _application 而不是包装函数 application 来实现。因此 _application 无权访问我定义的环境变量。我该如何修复该行?

谢谢!

最佳答案

感谢this tip,我解决了问题#1

Note that the Flask app is imported inside the def application block — if you import it outside of this block, you won't be able to use the environment variables at the Flask app level or any file which is imported on application load. This is because the WSGI application hasn't loaded at the time you import the Flask application, so it can't pass the environment variables yet.

所以 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 问题。

关于python - 为什么 Flask 无法从 Apache (mod_wsgi) 看到我的环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38384454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com