Django 在 wsgi.py 中使用条件设置模块

3 投票
2 回答
2192 浏览
提问于 2025-04-18 09:34

我在我的Django项目中使用了一个设置模块,而不是一个单独的设置文件。这意味着在我的wsgi.py文件里,我会写类似这样的代码:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.prod") 或者 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.dev")

这取决于我当前的环境。我希望能在一个配置文件里设置一个变量,这样每次我推送到生产环境时,就不需要每次都去这个文件里改了。

你可能觉得这没什么大不了的?但其实很容易忘记,结果我的应用就会变得不安全,因为它使用的是开发环境的设置。我还想在应用的其他地方使用这个配置变量,这样我就有一个“全局”标志,可以用来设置我的应用是生产环境还是开发环境。

2 个回答

0

你也可以使用环境变量(或者机器名或用户名)来区分不同的机器。最好是在调试用的机器上设置这个变量,而在生产环境中不要设置,这样就不会忘记了。可以参考下面的方式:

if "yes" == os.environ.get("DJANGO_DEBUG_ENABLED"): 
    DEBUG = True
    # or 
    from settings_dev import *
else:
    DEBUG = False
    # or 
    from settings_prod import *

另外,你还可以在那儿放一个不在代码库里的文件,然后检查这个文件是否存在,或者从一个叫 settings_local.py 的文件中导入 DEBUG

4

那么我们可以这样做,创建三个设置文件:

  • settings.py(主文件)
  • settings_dev.py(为开发服务器覆盖一些设置)
  • settings_prod.py(为生产服务器覆盖一些设置)

settings.py文件的最后,检查一下是否DEBUG=True,如果是,就导入settings_dev.py,否则导入settings_prod.py

settings.py:

----
try:
    if DEBUG:
        from settings_dev import *
    else:
        from settings_prod import *
except ImportError:
    pass

使用这种方法,你只需要设置:

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

现在别说如果我忘了为特定服务器更改DEBUG的值怎么办。另一种解决方案是有两个独立的代码库,把settings_prod.py放进开发代码库的git忽略列表中,把settings_dev.py放进生产代码库的git忽略列表中。始终在settings_prod.py中设置DEBUG=False,在settings.py文件中设置DEBUG=True,然后在settings.py文件的最后这样做:

try:
    from settings_dev import *
except ImportError:
    try:
        from settings_prod import *
    except ImportError:
        pass

撰写回答