2014-04-15 43 views
2

我在Ubuntu 12.04上配置了Apache以使用WSGI运行我的Python Flask Web应用程序。这里是/ 000-缺省的/ etc/apache2的/启用站点-的一部分:Python Flask WSGI文件忽略了用户的环境变量

<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

你是如何设置环境变量的?你是否'导出'它可以在shell外部使用? –

+0

在/home/3dkit/.profile的情况下,是的,我使用了导出。在/ etc/environment的情况下,按照https://help.ubuntu.com/community/EnvironmentVariables。 –

回答

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的Request对象访问它,可用于,例如from flask import Flask, request。然后你可以访问,例如request.environ['HTTP_REFERER']

相关问题