Django 设置¶
Django 设置文件包含 Django 安装的所有配置。本文档解释了设置的工作方式以及可用的设置。
基础知识¶
设置文件只是一个包含模块级变量的 Python 模块。
这里有一些设置示例
ALLOWED_HOSTS = ["www.example.com"]
DEBUG = False
DEFAULT_FROM_EMAIL = "webmaster@example.com"
注意
如果将DEBUG
设置为 False
,则还需要正确设置 ALLOWED_HOSTS
设置。
因为设置文件是一个 Python 模块,所以以下内容适用:
不允许出现 Python 语法错误。
可以使用正常的 Python 语法动态分配设置。例如:
MY_SETTING = [str(i) for i in range(30)]
可以从其他设置文件导入值。
指定设置¶
- DJANGO_SETTINGS_MODULE¶
使用 Django 时,必须告诉它正在使用哪个设置。为此,请使用环境变量 DJANGO_SETTINGS_MODULE
。
DJANGO_SETTINGS_MODULE
的值应采用 Python 路径语法,例如 mysite.settings
。请注意,设置模块应位于 Python sys.path
中。
django-admin
实用程序¶
使用 django-admin 时,您可以一次设置环境变量,或者在每次运行实用程序时显式传入设置模块。
示例(Unix Bash shell)
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
示例(Windows shell)
set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
使用 --settings
命令行参数手动指定设置
django-admin runserver --settings=mysite.settings
在服务器上 (mod_wsgi
)¶
在实时服务器环境中,您需要告诉您的 WSGI 应用程序使用哪个设置文件。使用 os.environ
执行此操作。
import os
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
阅读 Django mod_wsgi 文档,了解有关信息以及 Django WSGI 应用程序的其他常见元素。
默认设置¶
如果 Django 设置文件不需要定义任何设置,则不必定义任何设置。每个设置都有一个合理的默认值。这些默认值位于模块 django/conf/global_settings.py 中。
以下是 Django 用于编译设置的算法:
从
global_settings.py
加载设置。从指定的设置文件加载设置,根据需要覆盖全局设置。
请注意,设置文件不应从 global_settings
导入,因为这是多余的。
查看已更改的设置¶
命令 python manage.py diffsettings
显示当前设置文件与 Django 默认设置之间的差异。
更多信息,请参见 diffsettings
文档。
在 Python 代码中使用设置¶
在 Django 应用程序中,通过导入对象 django.conf.settings
来使用设置。示例:
from django.conf import settings
if settings.DEBUG:
# Do something
...
请注意,django.conf.settings
不是模块,它是一个对象。因此,无法导入单个设置。
from django.conf.settings import DEBUG # This won't work.
另请注意,您的代码不应从 global_settings
或您自己的设置文件导入。 django.conf.settings
抽象了默认设置和特定于站点的设置的概念;它提供了一个单一接口。它还将使用设置的代码与设置位置分离。
在运行时更改设置¶
不应在应用程序中运行时更改设置。例如,不要在视图中执行此操作:
from django.conf import settings
settings.DEBUG = True # Don't do this!
唯一应该为设置赋值的地方是设置文件。
安全性¶
因为设置文件包含敏感信息(例如数据库密码),因此应尽一切努力限制对其的访问。例如,更改其文件权限,以便只有您和 Web 服务器的用户可以读取它。这在共享主机环境中尤其重要。
可用设置¶
有关可用设置的完整列表,请参见 设置参考。
创建您自己的设置¶
没有什么可以阻止您为自己的 Django 应用程序创建自己的设置,但是请遵循以下指南:
设置名称必须全部大写。
不要重新发明一个已经存在的设置。
对于作为序列的设置,Django 本身使用列表,但这只是一个约定。
在不设置 DJANGO_SETTINGS_MODULE
的情况下使用设置¶
在某些情况下,您可能希望绕过 DJANGO_SETTINGS_MODULE
环境变量。例如,如果您单独使用模板系统,则可能不想设置指向设置模块的环境变量。
在这些情况下,您可以手动配置 Django 的设置。为此,请调用:
- django.conf.settings.configure(default_settings, **settings)¶
示例
from django.conf import settings
settings.configure(DEBUG=True)
传递 configure()
任意数量的关键字参数,每个关键字参数代表一个设置及其值。每个参数名称都应大写,与上面描述的设置名称相同。如果未将特定设置传递给 configure()
并且稍后需要它,Django 将使用默认设置值。
这种方式配置 Django 主要是在您在更大的应用程序中使用框架的一部分时必要的,并且实际上也是推荐的。
因此,当通过 settings.configure()
配置时,Django 不会对进程环境变量进行任何修改(有关为什么通常会发生这种情况,请参见 TIME_ZONE
的文档)。在这种情况下,假设您已经完全控制了环境。
自定义默认设置¶
如果您希望默认值来自 django.conf.global_settings
以外的位置,则可以在对 configure()
的调用中将提供默认设置的模块或类作为 default_settings
参数(或作为第一个位置参数)传入。
在此示例中,默认设置取自 myapp_defaults
,并且 DEBUG
设置设置为 True
,无论其在 myapp_defaults
中的值如何。
from django.conf import settings
from myapp import myapp_defaults
settings.configure(default_settings=myapp_defaults, DEBUG=True)
以下示例使用 myapp_defaults
作为位置参数,是等效的:
settings.configure(myapp_defaults, DEBUG=True)
通常,您不需要以这种方式覆盖默认值。Django 默认值足够温和,您可以安全地使用它们。请注意,如果您确实传入一个新的默认模块,它将完全 *替换* Django 默认值,因此您必须为导入的代码中可能使用的每个可能的设置指定一个值。在 django.conf.settings.global_settings
中检查完整列表。
需要 configure()
或 DJANGO_SETTINGS_MODULE
¶
如果不设置DJANGO_SETTINGS_MODULE
环境变量,则*必须*在使用任何读取设置的代码之前,在某个时刻调用configure()
。
如果既没有设置DJANGO_SETTINGS_MODULE
,也没有调用configure()
,则Django会在第一次访问设置时引发ImportError
异常。
如果设置了DJANGO_SETTINGS_MODULE
,以某种方式访问了设置值,*然后*调用configure()
,Django将引发一个RuntimeError
,指示设置已配置。为此有一个属性
- django.conf.settings.configured¶
例如
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
此外,调用configure()
多次,或在访问任何设置后调用configure()
都是错误的。
简而言之:只使用configure()
或DJANGO_SETTINGS_MODULE
两者之一。不能两者都用,也不能两者都不用。
对于“独立”的Django使用,需要调用django.setup()
¶
如果您使用Django的“独立”组件——例如,编写一个加载一些Django模板并渲染它们,或使用ORM获取一些数据的Python脚本——除了配置设置之外,还需要执行一个步骤。
在设置DJANGO_SETTINGS_MODULE
或调用configure()
之后,您需要调用django.setup()
来加载您的设置并填充Django的应用程序注册表。例如
import django
from django.conf import settings
from myapp import myapp_defaults
settings.configure(default_settings=myapp_defaults, DEBUG=True)
django.setup()
# Now this script or any imported module can use any part of Django it needs.
from myapp import models
请注意,只有当您的代码确实是独立的时,才需要调用django.setup()
。当由您的Web服务器或通过django-admin调用时,Django将为您处理此问题。
django.setup()
只能调用一次。
因此,避免将可重用的应用程序逻辑放在独立脚本中,以免您必须从脚本导入到应用程序的其他地方。如果您无法避免这种情况,请将对django.setup()
的调用放在if
块内
if __name__ == "__main__":
import django
django.setup()
另请参见
- 设置参考
包含核心和contrib应用程序设置的完整列表。