execute_from_command_line()
utility.execute()
--->django.setup()
self.fetch_command('runserver').run_from_argv(self.argv)
--->fetch_command('runserver') 返回对应命令模块的类的实例,这里是'runserver'命令的类
--->run_from_argv(self.argv)
--->execute()做一些设置参数的错误检查,然后设置句柄
--->handle()做些设置
--->run() 主要调用inner_run,区分是否是use_reloader
--->inner_run()
--->inner_run() 设置句柄handler,WSGIHandler 的实例
---run(handler...)一个标准的 wsgi 实现
manage.py 文件里只有简单的几行代码:
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
# 将settings模块设置到环境变量中
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "webui.settings")
from django.core.management import execute_from_command_line
# 执行命令
execute_from_command_line(sys.argv)
在设置环境变量之后,命令参数的列表传到了 execute_from_command_line 中:
def execute_from_command_line(argv=None):
"""
A simple method that runs a ManagementUtility.
"""
utility = ManagementUtility(argv)
utility.execute()
prog_name 就是 manage.py。实例化后调用了 execute() 方法,在这个方法中,会对命令参数进行处理。当解析的的命令是 runserver 时,会有两条路,第一个是会自动重装的路线,通过 autoreload.check_errors(django.setup)() 代理完成。另一个路线是参数中有 --noreload 时,就用 django.setup() 来启动服务。setup的作用主要就是为各个app实例化实例,实例中有各个app的信息。
如果不是 runserver 而是其他命令,那么会对命令参数 self.argv[1] 进行判断,包括错误处理,是否是 help ,是否是 version ,根据不同的情况展示不同的信息。
最重要的是最后一句,即前面的情况都不是,就进入 self.fetch_command(subcommand).run_from_argv(self.argv) &#x