在 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>
参数启动服务器,通过它您可以在不同的环境中使用不同的 设置 。
使用这种方法的好处:
您的设置将根据每个环境模块化
您可以在 environmnet_configuration.py
中导入包含基本配置的 master_settings.py
并覆盖您想要在该环境中更改的值。
如果您有庞大的团队,每个开发人员都可能有自己的 local_settings.py
,他们可以将其添加到代码存储库中,而不会有任何修改服务器配置的风险。如果您使用 git 或 .hginore
如果您使用 Mercurial,则可以将这些本地设置添加到 .gitnore
代码版本控制。这样一来,本地设置甚至不会成为实际代码库的一部分,以保持其整洁。
使用django-configurations定义一些替代配置并在每台机器上设置环境变量DJANGO_CONFIGURATION
运行代码选择一个。
您可以随意定义 classes,但我建议定义一个 Common
class,一切都继承自它,然后 Dev
、Test
和 Prod
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
。
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
,您的服务器只是 returns500
状态代码,没有任何堆栈跟踪。
在生产中,您必须将 DEBUG
设置为 False
以防止潜在的安全漏洞风险,以及您不希望用户知道的其他信息。
为了在不同的环境中使用不同的 settings
配置,创建不同的设置文件。在您的部署脚本中,使用 --settings=<my-settings.py>
参数启动服务器,通过它您可以在不同的环境中使用不同的 设置 。
使用这种方法的好处:
您的设置将根据每个环境模块化
您可以在
environmnet_configuration.py
中导入包含基本配置的master_settings.py
并覆盖您想要在该环境中更改的值。如果您有庞大的团队,每个开发人员都可能有自己的
local_settings.py
,他们可以将其添加到代码存储库中,而不会有任何修改服务器配置的风险。如果您使用 git 或.hginore
如果您使用 Mercurial,则可以将这些本地设置添加到.gitnore
代码版本控制。这样一来,本地设置甚至不会成为实际代码库的一部分,以保持其整洁。
使用django-configurations定义一些替代配置并在每台机器上设置环境变量DJANGO_CONFIGURATION
运行代码选择一个。
您可以随意定义 classes,但我建议定义一个 Common
class,一切都继承自它,然后 Dev
、Test
和 Prod
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
。