Django 2.1.3 文档 开发进程 配置

Django的settings文件包含Django应用的所有配置项。该文档会介绍settings是如何运行,以及有哪些设置项是可用的。

1. 基础

配置文件只是一个使用模块级变量的一个Python模块。

一组配置例子:

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

注意
如果你设置DEBUG=False,你可能还需要同时设置ALLOWED_HOSTS。↑

因为配置文件是Python模块,所以要注意以下几项:

(1)不能有Python语法错误
(2)可以用Python语法实现动态配置,例如:

MY_SETTING = [str(i) for i in range(30)]

(3)可以从其他配置文件中引入变量

2. 指定配置文件

DJANGO_SETTINGS_MODULE
使用Django时,要通知Django当前使用的是哪个配置文件。通过制定环境变量 DJANGO_SETTINGS_MODULE实现这一点。

DJANGO_SETTINGS_MODULE 的值是一个符合Python语法的路径,比如 mysite.settings。要注意settings模块应该在Python可搜索到的路径中 (import search path).

2.1 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

2.2 在服务器上(mod_wsgi)

在您的实时服务器环境中,您需要告诉WSGI应用程序要使用的设置文件。做到这一点使用os.environ

# manage.py 文件
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

阅读 Django mod_wsgi文档 以获取有关Django WSGI应用程序的更多信息和其他常见元素。

3.默认设置

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

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

(1)从global_settings.py中加载设置。
(2)从指定的设置文件加载设置,根据需要覆盖全局设置。

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

看看你改变了哪些设置
有一种简单的方法可以查看哪些设置不同于默认设置。该命令显示当前设置文件和Django默认设置之间的差异。

python manage.py diffsettings

有关更多信息,请参阅diffsettings文档。

4. 在其他地方使用settings

在您的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抽象了默认设置和特定于站点的设置的概念; 它呈现了一个单一的界面。它还将使用设置的代码与设置位置分离。

5. 在运行时更改设置

您不应在应用程序运行时更改设置。例如,不要在视图中执行此操作:

from django.conf import settings

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

您应该为设置分配的唯一位置是设置文件。

6. 安全

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

7. 可用设置

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

8. 创建自己的设置

对于您自己的Django应用程序,没有什么能阻止您创建自己的设置。请遵循以下准则:

(1)设置名称必须全部为大写。
(2)不要重复定义已经存在的设置。
对于作为序列的设置,Django本身使用列表,但这只是一个约定。

9. 不使用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了解为什么会出现这种情况)。在这些情况下,假设您已经完全控制了您的环境。

9.1 自定义默认设置

如果您希望默认值来自除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完整列表。

9.2 需要configure()或DJANGO_SETTINGS_MODULE之一

如果您没有设置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其中之一。

10. “单独”使用Django需要调用django.setup()

如果您正在使用Django的“独立”组件 - 例如,编写加载一些Django模板并呈现它们的Python脚本,或者使用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

译者注:其实就是你建了个python文件,它和manage.py文件同级,但你却想在python文件中调用django里的东西,就可以这么设置。

请注意,django.setup()只有在您的代码真正独立时才需要调用。当您的Web服务器或django-admin调用时,Django将为您处理此问题。

django.setup() 可能只被调用一次
因此,请避免将可重用的应用程序逻辑放在独立脚本中,以便必须从应用程序中的其他位置导入脚本。如果您无法避免,请将调用django.setup()放入 if块内:

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

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

猜你喜欢

转载自blog.csdn.net/lengfengyuyu/article/details/84669211