Django设置

Django设置文件包含Django安装的所有配置。本文档介绍设置的工作方式和可用的设置。

基础知识

设置文件只是一个包含模块级变量的python模块。

以下是几个示例设置:

ALLOWED_HOSTS = ["www.example.com"]
DEBUG = False
DEFAULT_FROM_EMAIL = "webmaster@example.com"

备注

如果你设置 DEBUGFalse ,您还需要正确设置 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上 import search 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 文档。

在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.

还要注意,您的代码应该 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的设置。请致电:

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 ,可以传入一个模块或类,该模块或类提供默认设置作为 default_settings 调用中的参数(或作为第一个位置参数) configure() .

在本例中,默认设置取自 myapp_defaultsDEBUG 设置设置为 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() ,Django将提高 ImportError 第一次访问设置时出现异常。

如果你设置 DJANGO_SETTINGS_MODULE ,以某种方式访问设置值, then 调用 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.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()

参见

The Settings Reference

包含核心和控制应用程序设置的完整列表。