Skip to content

Latest commit

 

History

History
253 lines (157 loc) · 10.8 KB

设置.md

File metadata and controls

253 lines (157 loc) · 10.8 KB

Django设置

一个Django设置文件包含你的Django安装的所有配置。本文介绍设置如何工作,以及哪些设置可用。

基础知识

设置文件仅仅是拥有模块级变量的Python模块。

这里有几个设置的例子:

ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = '[email protected]'

注意

如果设置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。注意,settings模块应该在 Python的 import搜索路径上。

django-admin功能

当使用django-admin时, 你可以一次性设置环境变量,或者在每一次运行此功能时显式传入settings模块。

例子(Unix Bash shell):

export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver

例子 (Windows shell):

set DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver

使用--settings命令行参数来手动指定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中导入,因为那是多余的。

看看你修改了哪些设置项

有一个简单的方法来看看哪些设置项是从默认设置项中继承过来的。命令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文档,看看为什么会正常出现)。它假定在这些情况下,你已经全面掌控了你的环境。

Custom default settings

If you’d like default values to come from somewhere other than django.conf.global_settings, you can pass in a module or class that provides the default settings as the default_settings argument (or as the first positional argument) in the call to configure().

In this example, default settings are taken from myapp_defaults, and the DEBUG setting is set to True, regardless of its value in myapp_defaults:

from django.conf import settings
from myapp import myapp_defaults

settings.configure(default_settings=myapp_defaults, DEBUG=True)

The following example, which uses myapp_defaults as a positional argument, is equivalent:

settings.configure(myapp_defaults, DEBUG=True)

Normally, you will not need to override the defaults in this fashion. The Django defaults are sufficiently tame that you can safely use them. Be aware that if you do pass in a new default module, it entirely replaces the Django defaults, so you must specify a value for every possible setting that might be used in that code you are importing. Check in django.conf.settings.global_settings for the full list.

Either configure() or DJANGO_SETTINGS_MODULE is required

If you’re not setting the DJANGO_SETTINGS_MODULE environment variable, you must call configure() at some point before using any code that reads settings.

If you don’t set DJANGO_SETTINGS_MODULE and don’t call configure(), Django will raise an ImportError exception the first time a setting is accessed.

If you set DJANGO_SETTINGS_MODULE, access settings values somehow, then call configure(), Django will raise a RuntimeError indicating that settings have already been configured. There is a property just for this purpose:

For example:

from django.conf import settings
if not settings.configured:
    settings.configure(myapp_defaults, DEBUG=True)

Also, it’s an error to call configure() more than once, or to call configure() after any setting has been accessed.

It boils down to this: Use exactly one of either configure() or DJANGO_SETTINGS_MODULE. Not both, and not neither.

Calling django.setup() is required for “standalone” Django usage

If you’re using components of Django “standalone” – for example, writing a Python script which loads some Django templates and renders them, or uses the ORM to fetch some data – there’s one more step you’ll need in addition to configuring settings.

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. For example:

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

Note that calling django.setup() is only necessary if your code is truly standalone. When invoked by your Web server, or through django-admin, Django will handle this for you.

See also

The Settings Reference Contains the complete list of core and contrib app settings.