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 启动的核心