Django 笔记 · 设置模块

Django 的设置模块

设置文件是一个 Python 模块,包含一系列的模块级别的变量。
作为 Python 模块,需要遵循:

  • 不能出现语法错误
  • 可以对设置项进行动态赋值
  • 可以从其他设置文件中导入设置项

指定设置模块

DJANGO_SETTINGS_MODULE 是表示设置文件路径的环境变量,使用 Python 路径语法。

在使用 django-admin 工具时,我们可以一次性设置好环境变量,也可以在每次运行工具时通过参数进行设置:

1
2
export DJANGO_SETTINGS_MODULE = mysite.settings
django-admin runserver

1
django-admin runserver --setting = mysite.settings

当我们使用 manage.py 工具运行项目时,DJANGO_SETTINGS_MODULE 已经为我们提前设置好了:

1
2
3
4
5
6
...
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
...


默认设置

默认设置存在于 django/conf/global_settings.py 模块中。
在编译设置时 Django 使用如下算法:

  • 加载 global_settings.py 中的全局设置
  • 加载指定设置文件中的设置,在必要时覆盖全局设置

在设置文件中,我们不需要重复导入 global_settings


使用设置

在应用中,我们可以导入 django.conf.settings 对象来使用定义的设置项。
需要注意的是,django.conf.settings 不是一个模块而是一个对象,所有设置都是这个对象的属性。


我们无法在应用运行时修改设置对象的属性,唯一能够修改设置的地方只能是在设置文件中。


创建自定义设置项

在创建自定义设置选项时需要注意以下几点:

  • 设置选项名应该全部是大写的
  • 不能重复使用已经存在的设置选项名

使用 configure()

我们可以通过使用 django.conf.settings.configure(default_settings, **settings) 来绕过设置 DJANGO_SETTINGS_MODULE 环境变量。

通过关键字参数传入需要配置的设置。

当我们通过无参的 settings.configure() 确认配置后,Django 不会修改任何变量。


默认设置来自于 django.conf.global_settings,如果我们需要提供自定义默认设置,可以在 configure() 中使用模块或类设置 default_settings 参数。自定义默认设置会替换默认设置,所以需要确保每个可能使用的设置在自定义设置中都有实现。


configure()DJANGO_SETTINGS_MODULE 不能同时使用,也不能都不用。

configure() 不能多次调用,也不能在存取设置之后调用。

settings.configured 属性可以判断设置是否已经被配置。


参考