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时,您必须告诉它您正在使用哪些设置。通过使用环境变量来实现这一点, DJANGO_SETTINGS_MODULE
。
的价值 DJANGO_SETTINGS_MODULE
应采用Python路径语法,例如 mysite.settings
。请注意,设置模块应位于Python上 sys.path
。
django-admin
效用¶使用时 django-admin ,您可以设置环境变量一次,也可以在每次运行实用程序时显式传递设置模块。
示例(Unix BashShell):
export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver
示例(WindowsShell):
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 documentation 有关Django WSGi应用程序的更多信息和其他常见元素。
Django设置文件不需要定义任何设置。每个设置都有一个合理的默认值。这些缺省值位于模块中 django/conf/global_settings.py 。
以下是Django在编译设置中使用的算法:
从加载设置 global_settings.py
.
从指定的设置文件加载设置,必要时覆盖全局设置。
请注意,设置文件应该 not 从进口 global_settings
因为这是多余的。
该命令 python manage.py diffsettings
显示当前设置文件和Django默认设置之间的差异。
有关更多信息,请参阅 diffsettings
文档。
在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.
还要注意,您的代码应该 not 从以下任一位置导入 global_settings
或您自己的设置文件。 django.conf.settings
抽象默认设置和特定于站点的设置的概念;它只显示一个接口。它还将使用设置的代码与设置的位置分离。
您不应该在运行时更改应用程序中的设置。例如,不要在视图中执行此操作:
from django.conf import settings
settings.DEBUG = True # Don't do this!
您应该分配给设置的唯一位置是设置文件。
由于设置文件包含敏感信息(如数据库密码),因此应尽一切努力限制对该文件的访问。例如,更改其文件权限,以便只有您和您的Web服务器的用户可以阅读它。这在共享宿主环境中尤其重要。
有关可用设置的完整列表,请参阅 settings reference .
没有什么可以阻止您为自己的Django应用程序创建自己的设置,但请遵循以下准则:
设置名称必须全部大写。
不要重新设计已经存在的设置。
对于序列设置,Django本身使用列表,但这只是一种约定。
DJANGO_SETTINGS_MODULE
¶在某些情况下,您可能想绕过 DJANGO_SETTINGS_MODULE
环境变量。例如,如果您单独使用模板系统,那么您可能不想设置指向设置模块的环境变量。
在这些情况下,您可以手动配置Django的设置。请致电:
例子::
from django.conf import settings
settings.configure(DEBUG=True)
通过 configure()
尽可能多的关键字参数,每个关键字参数代表一个设置及其值。每个参数名都应该是大写的,与上面描述的设置同名。如果未将特定设置传递给 configure()
在以后的某个时候需要,django将使用默认设置值。
以这种方式配置django是非常必要的——而且,确实,建议——当您在一个更大的应用程序中使用一个框架时。
因此,当通过 settings.configure()
,Django不会对过程环境变量进行任何修改(参见 TIME_ZONE
为什么会发生这种情况)。假设在这些情况下,您已经完全控制了您的环境。
如果您希望默认值来自 django.conf.global_settings
,可以传入一个模块或类,该模块或类提供默认设置作为 default_settings
调用中的参数(或作为第一个位置参数) configure()
.
在本例中,默认设置取自 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的默认设置非常温和,您可以安全地使用它们。请注意,如果您确实传入了一个新的默认模块,它将完全 replaces Django是缺省的,因此您必须为您要导入的代码中可能使用的每个可能的设置指定值。办理入住 django.conf.settings.global_settings
查看完整的名单。
configure()
或 DJANGO_SETTINGS_MODULE
是必填项¶如果您没有设置 DJANGO_SETTINGS_MODULE
环境变量,你 must 打电话 configure()
在使用任何读取设置的代码之前的某个时候。
如果不设置 DJANGO_SETTINGS_MODULE
别叫 configure()
,姜戈将提出一个 ImportError
第一次访问设置时例外。
如果您设置为 DJANGO_SETTINGS_MODULE
,以某种方式访问设置值, then 打电话 configure()
,姜戈将筹集 RuntimeError
指示已配置设置。为此目的有一个属性:
例如::
from django.conf import settings
if not settings.configured:
settings.configure(myapp_defaults, DEBUG=True)
另外,调用是一个错误 configure()
不止一次,或者调用 configure()
在访问任何设置之后。
归结起来就是:使用其中之一 configure()
或 DJANGO_SETTINGS_MODULE
.不是两者兼而有之,也不是两者兼而有之。
django.setup()
“独立”django使用需要¶如果您使用的是Django“Standalone”组件——例如,编写一个python脚本,该脚本加载并呈现一些Django模板,或者使用ORM获取一些数据——除了配置设置之外,还需要一个步骤。
在你两个都设置好之后 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()
参见
包含核心和控制应用程序设置的完整列表。
7月 22, 2024