django源码解析(二)

故事扮演 提交于 2020-01-04 20:40:05

书接上回

execute_from_command_line函数执行过程中, 遇到的第一个django的类 CommandParser

class CommandParser(ArgumentParser):

在使用django的扩展: 自定义命令时, 也用到了这个类.
ArgumentParser使用的是python的标准库argparse.
故此, 在使用django的自定义命令时, 关于参数解析(add_argument) 应该去参考argparse的文档说明.

在这里插入图片描述

settings.INSTALLED_APPS

这行代码很有意思, 首先settings是LazySettings类的一个实例化对象. 紧接着通过访问属性INSTALLED_APPS, 触发__getattr__函数, 在__getattr__函数中, 由于第一次访问settings变量, 此时会调用_setup函数, 将上一节提到的DJANGO_SETTINGS_MODULE环境变量对应的配置文件导入, 先放入_wrapped中缓存下来, 紧接着拿到_wrapped中INSTALLED_APPS属性值, 并将其写入到settings对象的属性当中.
以下为参考资料:
Django – settings 详解

__getattr__函数作用详解
首先要了解__getattr__函数的作用:
通过实例访问属性,都会经过__getattribute__函数。而当属性不存在时,仍然需要访问__getattribute__,不过接着要访问__getattr__。这就好像是一个异常处理函数。 当使用***类***访问不存在的变量是,不会经过__getattr__函数
引用自: https://blog.csdn.net/kekefen01/article/details/83042068

在这里插入图片描述

autoreload.check_errors(django.setup)()

这行看起来就挺复杂的, 仔细看看里面的调用
首先django.setup这个函数中
在这里插入图片描述

apps.populate(settings.INSTALLED_APPS)

分为几步

第一步: 初始化app配置, 同时导入app模块

在这里插入图片描述

第二步: 导入models模块

在这里插入图片描述

app_config.import_models()

调用的是django.apps.config的import_models
在这里插入图片描述在当前app下查找models模块

第三步: 执行各个app中的ready函数

在这里插入图片描述
这里的ready函数, 可以在新建的app模块下的apps.py中复写该函数

至此django.setup 的执行就结束了.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!