django python mange.py runserver 源码

django python mange.py runserver 源码  

入 口

    mange.py文件  

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

 

 

 

 

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

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

 

 

 

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



实例化运行__init__

  

 

 

 

 

 

 execute 执行 官方注释为:

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

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

 

 

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

 


 klass 对象 执行 run_from_argv 如下  

 

 

 

 

进入 execute后

 

 

 

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

 

 

 之所以能映射到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 即以字符串类型的索引导入类

 

 

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

 

 

 

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

 

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

 

 

 

 

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

 

 

 

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

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

 

 

 

 

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

 

 

 

 

posted @ 2020-06-24 09:36  熵殇  阅读(266)  评论(0编辑  收藏  举报