django源码解读python manage.py shell

当在进入 python 环境中导入 django 模块类

我们看一下哪里的问题,导致报错。

ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
主要是 获取环境中的 ENVIRONMENT_VARIABLE 变量,这个变量在manage.py 中设置了

当我们手动输入 ENVIRONMENT_VARIABLE 之后,又出现了一个错误。

这是执行报错的函数

这段代码的执行原因是 self.apps_ready = False, 然后执行报错
接下来就是 看变量 self.apps_ready 在哪里赋值的

在register.py 中有5个地方提到self.apps_ready,除掉赋值为False 的,只有两个地方为 True
第一个在 unset_installed_apps() 函数中,定义为 True,这个函数是去掉注册的apps, 在运行时没有调用这个函数。所以这个也不是,
第二个在 populate() 函数中赋值为True,然后看这个函数是否被调用,这个函数在django初始化 setup() 函数中会调用,然后去看setup 在哪里被调用

setup() 会在执行manage.py 中调用execute() 函数中调用,可以去看上一篇讲解 startproject 中讲 执行execute () 函数


现在就没有报错了,可以去执行一些ORM 操作。

接下来,我们看shell源码

在django执行过程中会去调用 handle 方法

handle()函数先去检查参数,然后检查平台不是win32并且不是在终端,他会退出,一般执行的话不会执行这段代码。

如果没有 -i 选项指定python内核,就会用上面定义的三种python 内核

下面这个for循环遍列表,getattr获取Command中的ipython,bpython,python函数,后面还有参数,如果导入错误,就会进入下一次循环。如果循环结束也没能进入python环境,就会抛出异常。一般这种情况很少见。

posted @ 2022-12-07 15:56  恰恰的故事  阅读(232)  评论(0编辑  收藏  举报