当前位置: 首页 > 面试题库 >

Django + mod_wsgi。从Apache的SetEnv设置OS环境变量

卢普松
2023-03-14
问题内容

我需要拆分Django的开发和生产设置。我决定,如果USKOVTASK_PROD设置了变量,则应用程序应使用生产设置。我阅读了这篇文章,并试图做到这一点。

我的摘要:

/etc/apache2/sites-enabled/uskovtask.conf:

<VirtualHost *:80>

ServerName uskovtask.*.com
ServerAlias uskovtask.*.com
DocumentRoot /mnt/ebs/uskovtask


Alias /static /mnt/ebs/uskovtask/static/
<Directory /mnt/ebs/uskovtask/static>
    Require all granted
</Directory>

#WSGIPythonPath /mnt/ebs/uskovtask
WSGIDaemonProcess uskovtask.*.com python-path=/mnt/ebs/uskovtask:/usr/lib/python2.7/site-packages
WSGIProcessGroup uskovtask.*.com
WSGIScriptAlias / /mnt/ebs/uskovtask/uskovtask/wsgi.py
SetEnv USKOVTASK_PROD 1


<Directory /mnt/ebs/uskovtask/uskovtask>
<Files wsgi.py>
    Require all granted
</Files>
</Directory>

</VirtualHost>

wsgi.py:

import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "uskovtask.settings")

from django.core.wsgi import get_wsgi_application

_application = get_wsgi_application()

def application(environ, start_response):
    if 'USKOVTASK_PROD' in environ:
        os.environ.setdefault('USKOVTASK_PROD', environ['USKOVTASK_PROD'])
    return _application(environ, start_response)

settings.py的一部分:

import os

if 'USKOVTASK_PROD' in os.environ:
    from settings_prod import *
else:
    from settings_dev import *

但是它总是导入settings_dev的设置。为什么?


问题答案:

这与来自Django wsgi.py文件的问题Access Apache
SetEnv变量有关

您需要按照答案所述继承WSGIHandler。

正如格雷厄姆·邓普尔顿(Graham Dumpleton)在第二个答案中所解释的那样,

综上所述,您提到的博客文章通常无济于事。这是因为它正在使用基于在Apache中使用SetEnv设置的每个请求WSGI环境设置为每个请求设置进程环境变量的讨厌技巧。如果环境变量的值可以根据URL上下文而有所不同,则这可能在多线程配置中引起各种问题。对于Django而言,这没有帮助,因为通常会在处理任何请求之前导入Django设置模块,这意味着环境变量在需要的时间将不可用。

我认为这就是您的情况。



 类似资料:
  • 问题内容: 我在Linux中编写了一个C程序,使用来设置环境变量的值,但是执行后,当我运行或时,环境变量本身似乎未设置。为什么? 这是代码片段: 问题答案: 环境变量在程序的上下文中设置。 程序退出时,您将返回到程序启动所在的上下文。

  • 问题内容: 在OS X中修改环境变量(如PATH)的正确方法是什么? 我稍微看了一下Google,发现需要编辑三个不同的文件: /etc/paths 〜/ .profile 〜/ .tcshrc 我什至没有这些文件,而且我很确定.tcshrc是错误的,因为OS X现在使用bash。这些变量(尤其是PATH)在哪里定义? 我正在运行OS X v10.5(Leopard)。 问题答案: 布鲁诺是正确的

  • 问题内容: 我在下面的代码中只想设置一个环境变量: 运行此文件: 该调用可以正确打印,但是随后我希望在会话中也设置此env变量,但是: 什么都没有,它是空的。这是预期的行为吗?如果是这样,我如何使这个env变量在我的会话中保持不变,并使用类似这样的程序对其进行设置? 问题答案: 创建新流程时,将复制父流程的环境。在新流程中对环境所做的更改不会影响父流程。修改环境后,您必须让程序启动Shell。

  • 由于 Django 系统的特殊性,很难在 Shell 中直接导入 Django 应用,而只能使用它自己提供的 shell 命令。不过,并不是说就没有办法使用增强的第三方 Shell 了,Django-Extensions 插件提供了切换默认 Shell 的能力。 Django Extensions Django-Extensions 是一个 Django 第三方插件集,其中囊括了很多实用的 Dja

  • 问题内容: 我希望能够在交互式sbt shell中设置环境变量,但我似乎找不到找到这种方法的方法。(我看过官方的sbt文档以及stackoverflow都没有成功)。 我想说明的是, 我不需要 在文件中设置此环境变量,而是可以在交互式sbt shell会话中即时更改它,以便将环境变量用于下一个我运行的sbt命令。 例如,我希望能够做类似的事情(在sbt shell中): 这可能吗?如果是的话,我该