django 配置 Django

Django项目的设置文件位于项目同名目录下,名叫settings.py。这个模块,集合了整个项目方方面面的设置属性,是项目启动和提供服务的根本保证。python

1、简述

settings.py文件本质上是一个Python模块,带有模块级别的变量。web

下面是一些示例设置:shell

ALLOWED_HOSTS = ['www.example.com']
DEBUG = False
DEFAULT_FROM_EMAIL = 'webmaster@example.com'

注:当DEBUG为False时,必须设置ALLOWED_HOSTS的值。数据库

配置settings.py时:django

  • 不容许出现Python层面的语法错误;
  • 可使用普通的Python语法动态地设置,例如:MY_SETTING = [str(i) for i in range(30)]
  • 能够从其它设置文件导入值。

2、指定配置文件

当你使用Django时,你必须告诉它你要使用哪一个配置文件来启动服务。也就是给环境变量DJANGO_SETTINGS_MODULE赋值。这个值要使用Python路径的语法,例如mysite.settings,而不是操做系统的文件路径语法。 注意,被设置的配置文件应该在Python的导入查找路径中。安全

默认状况下,咱们是不须要设置这个变量的,直接启动项目就能够。可是,有时候就会有须要使用别的配置启动项目的情形。服务器

django-admin命令:app

当使用django-admin命令时, 能够设置临时环境变量,或者每次运行该工具时显式地指定配置文件。工具

例如在Unix Bash shell下:spa

export DJANGO_SETTINGS_MODULE=mysite.settings
django-admin runserver

在Windows shell下,也就是cmd环境:

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' 

再次强调,全部上面的操做都要求mysite.settings必须在查找路径中,不然要用绝对路径。

3、默认配置

Django的配置文件并不须要定义全部的选项,每一个选项都有一个默认值,这些默认值位于django/conf/global_settings.py模块中。

Django加载配置的顺序是这样的:

  1. global_settings.py中加载默认配置;
  2. 从指定的配置文件中加载(一般是settings.py),若有必要则覆盖global_settings.py中的默认配置。

有一个简单的方法能够查看当前有哪些设置与默认的设置不同了,也就是python manage.py diffsettings命令。

4、在Django环境中使用settings

所谓的在Django环境中,指的是要使用settings的模块(能够简单的理解为局域网内主机),必须是Django工做状态中可以连接的模块,不能是孤零零,额外的一个Python脚本(外部主机)。这时,能够经过导入django.conf.settings来使用配置文件。 例如:

from django.conf import settings if settings.DEBUG: # Do something 

注意,django.conf.settings不是一个模块,而是一个对象。 因此不能够单独导入每一个配置项:

from django.conf.settings import DEBUG # 这是错误的作法 

5、不要在运行时更改设置

请不要在Django项目运行时改变设置。 例如,不要在视图中这样作:

from django.conf import settings settings.DEBUG = True # 不要这么作 

6、注意安全

由于settings.py常常会包含敏感的信息,例如管理员、远程主机、数据库的用户名或密码,你应该尽一切可能来限制对它的访问。 例如,修改它的文件权限使得只有你和Web服务器使用者能够读取它。

7、添加本身的配置项

若是要添加本身的配置项,需遵循如下准则:

  • 配置项名称必须全为大写。
  • 不要使用一个已经存在的设置

8、自定义默认设置

若是你想让默认值来自其它地方而不是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模块。

9、configure()DJANGO_SETTINGS_MODULE两者只能用一

若是你没有设置DJANGO_SETTINGS_MODULE环境变量,你必须使用configure()方法来加载配置。。

若是你没有设置DJANGO_SETTINGS_MODULE,也没有调用configure(),在首次调用配置文件时Django 将引起一个ImportError异常。也就是咱们最多见的问题:为啥我启动不了Django?为何个人脚本不能调用Django的功能?为何个人代码没法连接到Django内部?

若是你设置了DJANGO_SETTINGS_MODULE,并访问了一下设置,而后又调用configure(),Django 将引起一个RuntimeError异常,表示已经有配置,不要重复配置。

有个属性正好能够用于种状况,防止出现异常:

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

总结:configure()DJANGO_SETTINGS_MODULE只能用一个,而且只能用一次。不能够两个都用和都不用

10、外部脚本调用Django环境:django.setup()

若是你使用外部脚本, 加载一些Django模板,或者使用ORM来获取一些数据,除了配置settings模块以外,还须要一个步骤。

也就是在设置DJANGO_SETTINGS_MODULE或调用configure()以后,还须要调用django.setup(),像这样:

import django from django.conf import settings from myapp import myapp_defaults settings.configure(default_settings=myapp_defaults, DEBUG=True) django.setup() # 如今能够访问Django项目内部的模块了 from myapp import models 

请注意,只有真正独立的外部脚本,才须要调用django.setup()。前面有说到过,当处于服务器调用环境,或经过django-admin调用,Django将自动为你加载环境。

django.setup()只能调用一次。尽可能使用下面的方式,防止重复调用:

if __name__ == '__main__': import django django.setup()
相关文章
相关标签/搜索