Python Flask WSGI文件忽略了用户的环境变量

时间:2014-04-15 22:28:54

标签: python flask environment-variables wsgi

我在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文件本身中设置一个环境变量。

谁能告诉我我做错了什么?

1 个答案:

答案 0 :(得分:2)

WSGI守护程序进程在非常复杂的环境中运行,唯一设置的变量是PATH和LANG。 (在我的例子中,NOTIFY_SOCKET,因为Apache是​​由systemd启动的)。 USER,SHELL和您在交互式shell中看到的所有其他变量未设置,并且shell初始化文件(.profile等)不会运行。

您使用USER作为示例,还是您确实想要识别流程的所有者? os.getuid()和朋友会返回uid,您可以使用pwd.getpwuid(os.getuid())[0]之类的内容将其转换为用户名(请参阅pwdos模块)。

如果您真正想要的是访问CGI脚本(例如HTTP_REFERER,REMOTE_ADDR等)中可能会看到的典型服务器环境变量,那么这些变量位于服务器环境中,可以通过Werkzeug的请求访问Flask中的内容对象,例如可用的对象from flask import Flask, request。然后,您可以访问,例如request.environ['HTTP_REFERER']