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