首页 > 编程语言 >Django之settings源码分析

Django之settings源码分析

时间:2024-04-21 21:47:29浏览次数:28  
标签:配置文件 settings 配置 Django 源码 根目录 setting

引入

查看源码的前提

  • 刚开始阅读一些库的源码的时候,最好选一些代码量少的先感受一下
  • 看到看不懂的,没有必要去死磕,挑一些看得懂的,再结合网上的一些文献

一.django 的两个配置文件

  • 一个是暴露给用户可以自己自定义的配置文件也就是项目根目录下的settings.py
  • 一个是项目默认的配置文件:当用户不做任何配置的时候自动加载默认配置

二.分析源码解决疑问

  • 为什么配置文件必须是大写
  • 为什么当前用户配置了就是用用户配置的参数,没有配置就选择默认的参数

三.源码分析

1.突破口:settings文件

  • 我们可以手动导入settings文件,然后点进去看看到底是怎么回事from django.conf import settings

2.Ctrl + 点击进入settings文件

  • 映入眼帘的就是settings = LazySettings()
  • 可以发现settings是由LazySettings()实例化的对象

3.进入到LazySettings()类去看看怎么个事

  • settings_module = os.environ.get(ENVIRONMENT_VARIABLE)
  • 可以看到这一行代码, os.environ是获取到当前环境变量的所有配置,它的形式是一个字典
  • 所以这行代码的意思就是从这个配置大字典里面取出键为ENVIRONMENT_VARIABLE的值

4.进入到ENVIRONMENT_VARIABLE看看啥情况

  • ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
  • 这段字符串翻译过来就是django的配置模板,当django启动的时候就会加载这个配置,所以我们再去启动文件manage.py去查看一下

5.进入到manage.py一探究竟

  • os.environ.setdefault('DJANGO_SETTINGS_MODULE','pythonProjecttestmid.settings')
  • 不难解读出,这段代码的意思是给当前环境变量这个大字典的DJANGO_SETTINGS_MODULE设置一个默认值为pythonProjecttestmid

6.返回到LazySettings()类继续往下看

  • self._wrapped = Settings(settings_module)
  • 可以看到它将在manage.py里往环境变量塞进去的值给了Settings()这个类,实例化得到一个对象

7.进到Settings()这个类看一看

# 这个循环将global_settings这个全局配置的文件遍历了一遍
for setting in dir(global_settings):
    # 如果是大写的名称
    if setting.isupper():
        # 就将全局配置文件的内容加到当前这个对象
        setattr(self, setting, getattr(global_settings, setting))
# 将根目录下的配置文件路径赋值给SETTINGS_MODULE
self.SETTINGS_MODULE = settings_module
# 用importlib模块,以字符串的形式导入根目录下的配置文件
mod = importlib.import_module(self.SETTINGS_MODULE)

# 根据以上分析,大概可以推算出接下来要对mod做手脚,此时mod就是项目根目录下的配置文件对象
# 这一点我认为需要搞清楚

8.继续往下看,看有没有关于mod的内容

# 跟之前的套路一样 遍历根目录下的配置文件
for setting in dir(mod):
    # 如果名称是大写
    if setting.isupper():
        # 就将它的值赋给 setting_value
        setting_value = getattr(mod, setting)

		... # 这里看不懂的就省略了
        # 再将setting_value赋值给settings对象,也就是最开始导入的那个settings
        setattr(self, setting, setting_value)
        self._explicit_settings.add(setting)

四.总结

通过Settings类的源码分析,我们可以得出这样一个步骤:

  • 先得到全局全局配置文件中所有的大写配置,然后通过一些方法将其加入到settings对象里面

  • 再得到根目录下的所有的大写配置,再将他也加入到settings对象里面

  • 这样就可以做到让根目录下的配置覆盖默认配置

标签:配置文件,settings,配置,Django,源码,根目录,setting
From: https://www.cnblogs.com/Hqqqq/p/18149544

相关文章

  • django sql 操作
    *非空判断ifparamisNone://只判断null值ifnotparam://判断null值同时判断字段是否空值*if-elseif-else写法:ifself.returned_at: return"已還書"elifself.overdue_settled: return"借閱中(已繳部分金額)"else: return"借閱中(已繳部......
  • 计算机毕业设计源码-基于 SpringBoot 开发的班级综合测评系统研究与实现
    技术栈开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9浏览器:谷歌浏览器3.需求分析用户需求分析根据账号登陆进入班级综合测评管理系统,系统根据角色展示相应......
  • 从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
    写在开头随手一翻,发现对于Java中并发多线程的学习已经发布了十几篇博客了,多线程是Java基础中的重中之重!因此,可能还需要十几篇博客才能大致的讲完这部分的知识点,初学者对于这部分内容一定要多花心思,不可马虎!今天我们继续来学习一个重要知识点:ReentrantLockReentrantLock:是一种......
  • 【记一个小坑】linux源码在window10使用过程中的坑
    在window10解压linux.tar.gz的时候遇到了一下几个问题:(我用的解压软件是Bandzip)1、解压的时候会有如下图的提示,网上有一些人说不用管,直接覆盖,但是并不是所有人都适用,如果你是想要修改linux源码,然后编译安装的话,直接覆盖,之后会造成编译的时候报错:找不到XXX文件原因是windows默......
  • PostgreSQL源码编译安装指南
    一、版本说明centos7.9postgresql12.2二、配置系统基本环境#1.创建postgres用户groupaddpostgresuseradd-gpostgrespostgresecho"666666"|passwdpostgres--stdin#2.配置用户环境变量su-postgrescat>>~/.bash_profile<<EOFexportPGPORT=1922expor......
  • 短视频源码,高效异常处理让您的代码更完美
    在编写Python代码的过程中,我们常常会遇到各种错误和异常。学会有效地处理这些异常,可以让短视频源码更加健壮、稳定。本文将带您深入了解Python异常处理的艺术,让您的短视频源码更加完美!一.异常简介异常是在短视频源码执行过程中发生的事件,通常表示代码中存在错误或异常情况......
  • django自带的权限介绍(rbac)
    权限介绍#1写过权限类---》控制用户,是否有权限访问我们的接口#2之前咱们直接定死,普通用户,超级用户,管理员这种身份,给不同人设置不同权限#3比如都是互联网用户:抖音acl控制 -游客用户只能查看-登陆用户可以查看和评论-粉丝超过1000用户,开直播#4公司......
  • 企业微信hook 最新版 、企微输入验证码,二次扫码方案、发名片收消息功能,企业微信hook源
    ​产品说明在PC端企业微信客户端上发送自定义名片、封装企业微信功能为DLL,可与其他语言调用实现功能。DLL可以监听企业微信的所有消息接收和群消息,根据需求实现机器人、群发、自动消息推送、聊天机器人、监管数据收集等功能企业微信hook,企业微信功能api,自定义开发功能清......
  • Django国际化和本地化
    国际化和本地化定义国际化和本地化的目标是让同一站点为不同的用户提供定制化的语言和格式服务。Django支持文本、格式化日期、时间、数字以及时区的翻译。实际上,Django做了两件事:允许开发者和模板设计者指定在他们的app中哪些部分需要进行翻译或者格式化成当地的语言、......
  • 马扎克,海德汉,哈斯,兄弟,发那科,三菱,西门子,华中数控,knd,广数,宝元,发格,无授权源码采集。机床
    机床联网cnc采集设备联网车间数字化生产追踪 无需授权可跨平台运行任何平台Linuxwindows等 可+:cnccaiji机床数据采集MDC,DNC,可定制开发,有采集驱动支持多品牌cnc系统多设备采集支持转发mqtt推送HTTP马扎克机床数据采集海德汉机床数据采集哈斯机床数据采集......