2014-04-15 83 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']

相關問題