django python mange.py runserver 源码

时间:2023-03-08 20:47:17

django python mange.py runserver 源码

入 口

    mange.py文件

      execute_from_command_line函数 输入参数为['manage.py', 'runserve'] sys模块监听命令行输入 并将值放入argv
      并执行

django python mange.py runserver 源码

进入后 直接到达 django-core-mangement- __init__ 内

execute_from_command_line函数
   执行后 ---ManagementUtility 实例化 并且执行了execute() 方法

django python mange.py runserver 源码

其中 实例化 ManagementUtility 目录结构如下


django python mange.py runserver 源码

实例化运行__init__

  

django python mange.py runserver 源码

execute 执行 官方注释为:

"""
Given the command-line arguments, figure out which subcommand is being
run, create a parser appropriate to that command, and run it.
"""

给定命令行参数,找出哪个子命令创建适合该命令的解析器,然后运行

django python mange.py runserver 源码

来到fetch_command函数内 发现最终返回klass对象执行其run_from_argv方法 而当前klass对象经过了load_command_class 映射 为方便理解  后面我们再去看

django python mange.py runserver 源码


klass 对象 执行 run_from_argv 如下

django python mange.py runserver 源码

进入 execute后

django python mange.py runserver 源码

注意 handle 函数 会优先 执行当前对象的handle 没有之后再去寻找父类handle
而我们当前对象为runserver的commands

django python mange.py runserver 源码

之所以能映射到management.commmands.runserver.command 是之前提到了的 load_command_class  做的映射

load_command_class 如下:

module = import_module('%s.management.commands.%s' % (app_name, name))  #其内部字符串为 django.contrib.staticfiles.management.commands.runserver #提示import_module就是常用的importlib.import_module 即以字符串类型的索引导入类

django python mange.py runserver 源码

我们按照路径去到 runserver模块内部 发现内部如下

django python mange.py runserver 源码

因为其内部并没有handle 函数 所以我们进入其父类 寻找

我们进入core.management.command.runserver 找到了handle

django python mange.py runserver 源码

进过上面的映射 我们终于找到了 runserver 下的handle 并执行run函数

django python mange.py runserver 源码

但是并没有看到我们希望的核心代码 经过打印我们知道 此时use_reloader =True 意味着我们执行

autoreload.run_with_reloader(self.inner_run, **options)
进入其内部

django python mange.py runserver 源码

来到start_django 终于 终于` 我们看到了django 启动的核心

django python mange.py runserver 源码

django python mange.py runserver 源码