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 T0> ¶ T1>

当你使用Django的时候,你必须告诉它你正在使用哪些设置。 通过使用环境变量DJANGO_SETTINGS_MODULE来完成。

DJANGO_SETTINGS_MODULE的值应该是Python路径语法,例如mysite.settings 请注意,设置模块应该位于Python 导入搜索路径上。

django-admin工具

当使用django-admin时,您可以设置一次环境变量,或者每次运行实用程序时显式传入设置模块。

例子(Unix Bash shell):

export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver

示例(Windows外壳):

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加载设置。
  • 从指定的设置文件加载设置,根据需要覆盖全局设置。

请注意,设置文件应不从global_settings导入,因为这是多余的。

看看你已经改变了哪些设置

有一个简单的方法来查看您的哪些设置偏离默认设置。 显示当前设置文件和Django默认设置之间的区别。命令python manage.py diffsettings

有关更多信息,请参阅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 abstracts the concepts of default settings and site-specific settings; it presents a single interface. 它还会将使用设置的代码从您的设置位置分离出来。

在运行时改变设置

您不应该在运行时更改应用程序中的设置。 例如,不要在视图中这样做:

from django.conf import settings

settings.DEBUG = True   # Don't do this!

您应该分配给设置的唯一位置是在设置文件中。

安全¶ T0>

由于设置文件包含敏感信息(如数据库密码),因此应尽量限制对其的访问。 例如,更改其文件权限,以便只有您和您的Web服务器的用户才能读取它。 这在共享托管环境中尤为重要。

可用的设置

有关可用设置的完整列表,请参阅settings reference

创建您自己的设置

没有什么能够阻止你为自己的Django应用程序创建自己的设置。 只要遵循以下准则:

  • 设置名称必须全部大写。
  • 不要重新创建已有的设置。

对于序列设置,Django本身使用列表,但这只是一个约定。

Using settings without setting DJANGO_SETTINGS_MODULE

在某些情况下,您可能要绕过DJANGO_SETTINGS_MODULE环境变量。 例如,如果您自己使用模板系统,则可能不需要设置指向设置模块的环境变量。

在这些情况下,您可以手动配置Django的设置。 通过调用:

django.conf.settings。配置default_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_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中查看完整列表。

Either configure() or DJANGO_SETTINGS_MODULE is required

如果您没有设置DJANGO_SETTINGS_MODULE环境变量,则在使用任何读取设置的代码之前,必须调用configure()

如果你没有设置DJANGO_SETTINGS_MODULE并且不调用configure(),Django会在第一次访问设置时引发一个ImportError异常。

如果设置了DJANGO_SETTINGS_MODULE,以某种方式访问​​设置值,然后调用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.setup()是“standalone”Django用法

如果你正在使用Django的“standalone”组件,比如编写一个Python脚本来加载一些Django模板并渲染它们,或者使用ORM来获取一些数据,那么除了配置设置之外还需要一个步骤。

After you’ve either set DJANGO_SETTINGS_MODULE or called configure(), you’ll need to call django.setup() to load your settings and populate Django’s application registry. 例如:

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() may only be called once.

因此,避免在独立脚本中放置可重用的应用程序逻辑,以便您必须从应用程序中的其他位置导入脚本。 如果你不能避免这种情况,把django.setup()放在if块中:

if __name__ == '__main__':
    import django
    django.setup()

也可以看看

设置参考
包含核心和贡献应用程序设置的完整列表。