【问题标题】:Python Flask WSGI file is ignoring user's environment variablesPython Flask WSGI 文件忽略用户的环境变量
【发布时间】:2014-05-30 12:22:14
【问题描述】:

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

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

【问题讨论】:

  • 你是如何设置环境变量的?你export它是不是可以在外壳之外使用?
  • 在 /home/3dkit/.profile 的情况下,是的,我使用了导出。在 /etc/environment 的情况下,不,根据help.ubuntu.com/community/EnvironmentVariables

标签: python flask environment-variables wsgi


【解决方案1】:

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 等),它们位于服务器环境中,在 Flask 中可以通过 Werkzeug 的 Request 对象访问,即可用,例如from flask import Flask, request。然后您可以访问,例如request.environ['HTTP_REFERER']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-13
    • 2012-09-05
    • 1970-01-01
    • 2020-10-09
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多