我在Ubuntu 12.04上配置了Apache,使用WSGI运行我的Python Flask Web应用程序。这是/ etc / apache2 / sites-enabled / 000-default的一部分:
<VirtualHost *>
WSGIDaemonProcess 3dkit user=3dkit group=3dkit threads=5
WSGIScriptAlias /3dkit /3dkit/kit.wsgi
WSGIPassAuthorization On
<Location /3dkit>
WSGIProcessGroup 3dkit
</Location>
...
这是/3dkit/kit.wsgi:
import os
import sys
sys.path.insert(0, '/3dkit')
print 'user =', os.environ['USER']
from kit import app as application
打印命令失败,异常
KeyError: 'USER'
终端窗口中的这个命令:
sudo -u 3dkit printenv USER
按预期输出“3dkit”。
这不仅仅是这个环境变量。无论我如何尝试设置环境变量,无论是在/home/3dkit/.profile中,还是在/ etc / environment中,或者我能想到的任何其他方式,都会在我的WSGI文件中忽略它。我能使其工作的唯一方法是显式调用os.environ并在WSGI文件本身中设置一个环境变量。
谁能告诉我我做错了什么?
答案 0 :(得分:2)
WSGI守护程序进程在非常复杂的环境中运行,唯一设置的变量是PATH和LANG。 (在我的例子中,NOTIFY_SOCKET,因为Apache是由systemd启动的)。 USER,SHELL和您在交互式shell中看到的所有其他变量未设置,并且shell初始化文件(.profile等)不会运行。
您使用USER
作为示例,还是您确实想要识别流程的所有者? os.getuid()
和朋友会返回uid,您可以使用pwd.getpwuid(os.getuid())[0]
之类的内容将其转换为用户名(请参阅pwd
和os
模块)。
如果您真正想要的是访问CGI脚本(例如HTTP_REFERER,REMOTE_ADDR等)中可能会看到的典型服务器环境变量,那么这些变量位于服务器环境中,可以通过Werkzeug的请求访问Flask中的内容对象,例如可用的对象from flask import Flask, request
。然后,您可以访问,例如request.environ['HTTP_REFERER']