在 Django 项目中根据环境处理不同 configuration/settings 的最佳方法

Best way to handle different configuration/settings based on environment in Django project

Is DEBUG == False supposed to mean that the app is running in production environment?

至少,这是我偶尔看到的on the internet。但是我在 settings.py 中输入什么呢?好的,我可以将本地设置放入 settings_local.py 并从 settings.py 导入它。但是如果某些设置取决于环境,那么我必须将它们放在 import 语句之后。越想越不喜欢。你呢?

作为问题的答案:

Is DEBUG == False supposed to mean that the app is running in production environment?

DEBUG 是您在 setting.py 文件中定义的配置。

  • 如果设置为 True,如果出现未处理的异常,它会显示完整的堆栈跟踪以及所有已声明变量的值。

  • 如果设置为 False,您的服务器只是 returns 500 状态代码,没有任何堆栈跟踪。

在生产中,您必须将 DEBUG 设置为 False 以防止潜在的安全漏洞风险,以及您不希望用户知道的其他信息。


为了在不同的环境中使用不同的 settings 配置,创建不同的设置文件。在您的部署脚本中,使用 --settings=<my-settings.py> 参数启动服务器,通过它您可以在不同的环境中使用不同的 设置

使用这种方法的好处:

  1. 您的设置将根据每个环境模块化

  2. 您可以在 environmnet_configuration.py 中导入包含基本配置的 master_settings.py 并覆盖您想要在该环境中更改的值。

  3. 如果您有庞大的团队,每个开发人员都可能有自己的 local_settings.py,他们可以将其添加到代码存储库中,而不会有任何修改服务器配置的风险。如果您使用 git.hginore 如果您使用 Mercurial,则可以将这些本地设置添加到 .gitnore代码版本控制。这样一来,本地设置甚至不会成为实际代码库的一部分,以保持其整洁。

使用django-configurations定义一些替代配置并在每台机器上设置环境变量DJANGO_CONFIGURATION运行代码选择一个。

您可以随意定义 classes,但我建议定义一个 Common class,一切都继承自它,然后 DevTestProd classes.

任何涉及系统配置的东西都应该从环境变量中提取(例如数据库连接、缓存连接等)。

玩得开心!

要添加到@anonymous 答案,这是我想出的脚本 (manage.sh):

#!/usr/bin/env bash
DIR=$(dirname -- "$(readlink -f -- "[=10=]")")
export PYTHONPATH="$DIR${PYTHONPATH:+:$PYTHONPATH}"
if [ -e <app>/local_settings.py ]; then
    export DJANGO_SETTINGS_MODULE=<app>.local_settings
else
    export DJANGO_SETTINGS_MODULE=<app>.settings
fi
django-admin "$@"

如果存在则使用 <app>.local_settings。否则它会回落到 <app>.settings.

或者,您可以只编辑 manage.py