Django 在 wsgi.py 中使用条件设置模块
我在我的Django项目中使用了一个设置模块,而不是一个单独的设置文件。这意味着在我的wsgi.py文件里,我会写类似这样的代码:
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.prod")
或者
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings.dev")
这取决于我当前的环境。我希望能在一个配置文件里设置一个变量,这样每次我推送到生产环境时,就不需要每次都去这个文件里改了。
你可能觉得这没什么大不了的?但其实很容易忘记,结果我的应用就会变得不安全,因为它使用的是开发环境的设置。我还想在应用的其他地方使用这个配置变量,这样我就有一个“全局”标志,可以用来设置我的应用是生产环境还是开发环境。
2 个回答
你也可以使用环境变量(或者机器名或用户名)来区分不同的机器。最好是在调试用的机器上设置这个变量,而在生产环境中不要设置,这样就不会忘记了。可以参考下面的方式:
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
。
那么我们可以这样做,创建三个设置文件:
- 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