Skip to main content

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 import search 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 WSGI应用程序的更多信息和其他常见元素,请阅读 Django mod_wsgi文档

默认设置

如果Django设置文件不需要,则不必定义任何设置。每个设置都有一个合理的默认值。这些默认值存在于模块 django/conf/global_settings.py 中。

这里是Django在编译设置中使用的算法:

  • global_settings.py 加载设置。

  • 从指定的设置文件加载设置,根据需要覆盖全局设置。

请注意,设置文件应该 notglobal_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.

还要注意,您的代码应该从 notglobal_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 以外的地方,你可以传入一个模块或类,它提供了默认设置作为 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,指示已经配置了设置。有一个属性只是为了这个目的:

例如:

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的“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()

参见

设置参考

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