2014-04-15 3 views
2

WSGI를 사용하여 Python Flask 웹 응용 프로그램을 실행하기 위해 Ubuntu 12.04에 Apache를 구성했습니다. 다음은/etc/아파치/사이트 지원/000 기본의 일부입니다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

어떻게 환경 변수를 설정 했습니까? 당신은 그것을 수출하기 때문에 쉘 밖에서 사용할 수 있습니까? –

+0

/home/3dkit/.profile의 경우 예, export를 사용했습니다./etc/environment의 경우, https://help.ubuntu.com/community/EnvironmentVariables에 따릅니다. –

답변

2

WSGI 데몬 프로세스는 매우 santizied 환경에서 실행되며 PATH 및 LANG 만 설정됩니다. (그리고 내 경우에는 NOTIFY_SOCKET, 아파치는 systemd에 의해 시작되기 때문에). USER, SHELL 및 대화 형 쉘에 표시되는 다른 모든 변수는 설정되지 않으며 쉘 초기화 파일 (.profile 등)은 실행되지 않습니다.

예를 들어 USER을 사용하고 있습니까, 아니면 실제로 프로세스의 소유자를 확인하고 싶습니까? os.getuid()과 친구들은 uid를 반환 할 것이므로 pwd.getpwuid(os.getuid())[0]과 같은 것으로 사용자 이름으로 변환 할 수 있습니다 (pwdos 모듈 참조).

실제로 CGI 스크립트 (예 : HTTP_REFERER, REMOTE_ADDR 등)에서 볼 수있는 일반적인 서버 환경 변수에 액세스하려는 경우 서버 환경에 있고, 이는 Flask에서 Werkzeug의 Request 객체를 통해 액세스 할 수 있습니다. 예를 들면 from flask import Flask, request. 그런 다음에 액세스 할 수 있습니다. request.environ['HTTP_REFERER']