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应用程序设置的完整列表。

返回顶部