Django源码学习——配置文件解析

news/2024/7/24 2:18:18 标签: django, 学习

文章目录

  • global_settings
  • settings

同步发表在个人站点:https://panzhixiang.cn/2023/09/22/django-source-code-configuration/

用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的配置在代码中引用的时候如下:

from django.conf import setting

实际代码位于django.conf.__init__.py这个文件里面

下面是其中Settings类的一部分代码:

class Settings:
    def __init__(self, settings_module):
        for setting in dir(global_settings):
            if setting.isupper():
                setattr(self, setting, getattr(global_settings, setting))  # 这里用setattr动态设置属性

        self.SETTINGS_MODULE = settings_module

        # 动态地导入模块,于你在编写程序时并不知道具体会使用哪个模块,而是在运行时由用户输入或其他方式决定的情况非常有用。
        # 例如,在插件系统、基于配置的加载等场景中可能会用到它。
        mod = importlib.import_module(self.SETTINGS_MODULE)

        tuple_settings = (
            "ALLOWED_HOSTS",
            "INSTALLED_APPS",
            "TEMPLATE_DIRS",
            "LOCALE_PATHS",
            "SECRET_KEY_FALLBACKS",
        )
        self._explicit_settings = set()
        for setting in dir(mod):
            if setting.isupper():
                setting_value = getattr(mod, setting)

                if setting in tuple_settings and not isinstance(
                    setting_value, (list, tuple)
                ):
                    raise ImproperlyConfigured(
                        "The %s setting must be a list or a tuple." % setting
                    )
                setattr(self, setting, setting_value)
                self._explicit_settings.add(setting)

主要关注里面的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等多个文件。
想象一下,如果这里不使用动态引入,而是硬编码,我们就要为怎么适配不同的环境而头疼了。


http://www.niftyadmin.cn/n/5050340.html

相关文章

测试驱动开发与极限编程思想浅析

随着全球经济的发展与计算机技术的普及,各行业对计算机软件的需要量日益增加。与此同时对软件的质量要求也越来越高。而与之形成鲜明对比的是,随着软件需要的增加和规模的增大,能做出及时交付给用户以及让用户满意的软件却变得难上加难。传统…

2023.9.23 关于 HTTP 详解

目录 HTTP 协议 认识 URL HTTP 请求 认识方法 HTTP 响应 认识状态码 总结 HTTP 请求的构造 Form 表单构造 AJAX 构造 Postman 构造 HTTP 协议 应用层使用最广泛的协议浏览器 基于 HTTP协议 获取网站是 浏览器 和 服务器 之间的交互桥梁HTTP协议 基于传输层的 TCP协…

C# 把m4a格式文件转为MP3格式

直接上代码: 先引用 using NAudio.Wave; using NAudio.Lame; 1, 文件列表来自于根目录里所有的m4a文件 string directloc "G:\mp3\MP3"; string[] fyles Directory.GetFiles(directloc); NAudio.Wave.BlockAlignReductionStream stream …

ZooKeeper、CuratorFramework、Watcher、ConnectionStateListener

ZooKeeper Zookeeper的作用是提供一个分布式的协调服务,它可以让分布式系统中的各个节点之间进行通信和协调,从而保证整个系统的一致性和可靠性。Zookeeper的核心是一个分布式的文件系统,它可以存储和管理分布式系统中的各种信息&#xff0c…

协议-TCP协议-基础概念03-Keep live保活机制-TCP RST-TCP连接

Keep live保活机制-TCP RST-TCP连接 参考来源: 《极客专栏-网络排查案例课》 Keep live保活机制 定时发送心跳探测包; 对于心跳回复包有超时限制; 要打开这个 TCP Keep-alive 特性,你需要使用 setsockopt() 系统调用&#xff0…

拼多多商品详情数据接口

拼多多商品详情接口的具体内容。获取拼多多商品详情,可以参考如下方式: item_get_app-根据ID取商品详情原数据接口包括:标题,价格,促销价,优惠券,库存,销量,详情图片&am…

Flink-CDC——MySQL、SqlSqlServer、Oracle等数据库开启日志方法

文章目录 1. 前言 2. 数据源安装与配置 2.1 MySQL 2.1.1 安装 2.1.2 CDC 配置 2.2 Postgresql 2.2.1 安装 2.2.2 CDC 配置 2.3 Oracle 2.3.1 安装 2.3.2 CDC 配置 2.4 SQLServer 2.4.1 安装 2.4.2 CDC 配置 3. 验证 3.1 Flink版本与CDC版本的对应关系 3.2 下载…

泡泡玛特城市乐园开园在即,知名潮玩IP落地北京朝阳

今年以来,文旅产业成为亮眼消费赛道,大IP主题乐园再次受到市场关注。优质IP可以为园区引流,帮助乐园摆脱门票经济,平衡收入结构。 国内“潮玩第一股”泡泡玛特近日宣布,国内首个潮玩行业沉浸式IP主题乐园——泡泡玛特…