Django源码学习——配置文件解析
用Django好几年了,期间陆陆续续因为项目开发需要看过一点点源码,但是一直没有整体上看过源码,最近在B站上发现了一个不错的Django源码讲解教程,**沈奇才·Django4.0源码解读,打算跟着这个视频过一遍,不过我看到的目前最新的代码,我从Django的官方仓库fork了一份代码,yexia553/django** ,后面把想相关的注释和说明都提交在这个仓库的learning分支上。
我不打算逐行解释代码,只会记录一些我觉得写的不错或者对我理解Django的设计有帮助的内容。
这篇博客会记录一下django.conf.settings相关的代码,也就是Django中的项目配置相关的部分。
global_settings
这部分代码位于django.conf.global_settings,老实说,在这之前,我都不知道Django中还有这么一个代码的存在。
django.conf.global_settings里面包含了相较于django.conf.settings更全面的配置项,也是django.conf.seetings的基础。
settings
Django的配置在代码中引用的时候如下:
1 | from django.conf import setting |
实际代码位于django.conf.__init__.py
这个文件里面
下面是其中Settings类的一部分代码:
1 | class Settings: |
主要关注里面的setattr(self, setting, getattr(global_settings, setting))
和mod = importlib.import_module(self.SETTINGS_MODULE)
这两行代码。
setattr(self, setting, getattr(global_settings, setting))
通过setattr这个魔法函数来动态地为Settings类设置属性,这个设计使得我们可以在Django项目的settings.py这个文件中自定义配置并被django加载到。
mod = importlib.import_module(self.SETTINGS_MODULE)
的作用是动态地(运行时)导入模块,这对于我们在编写程序时并不知道具体会使用哪个模块,而是在运行时由用户输入或其他方式决定的情况非常有用。
其中的self.SETTINGS_MODULE
就是 DJANGO_SETTINGS_MODULE 这个环境变量的值,也正是因为这个设计,我们才可以把创建项目时默认的一个settings.py文件变成依据不同运行环境而编写的prod/settings.py、testing/settings.py等多个文件。
想象一下,如果这里不使用动态引入,而是硬编码,我们就要为怎么适配不同的环境而头疼了。