1.使用环境
win10 + python3.7 + django2.2 + mysql
2.具体分析
2.1一般使用本地启动命令
python manage.py runserver 0.0.0.0:8001
所以先进入manage.py看具体代码
调用了django.core.management的execute_from_command_line(sys.argv)
创建一个ManagementUtility(argv) 并执行execute()方法
2.2 setup()
其中 runserver 根据是否包含 --noreload 分别做了处理
但都要执行setup()函数

先读取日志配置 再从installed_apps收集所有注册的app
2.2.1installed_apps分三步 :

2.3 channel runserver
根据本地console打印日志 可以看出启动命令中的runserver是调用了channel中的command

追溯下 具体是如何调用的

也就是在django.setup中--apps.populate--app_config.ready时 打补丁 替换了原django staticfiles command 中 runserver 继承的父类
一般执行self.fetch_command(subcommand).run_from_argv(self.argv)
fetch_command 获取并收集所有app中默认命令并更新/添加用户的自定义命令


所以自定义command时 应在app/management/command下
run_from_argv


检查参数 并检查migrations文件
然后执行channel/management/commands/runserver.py--handler()

与django staticfiles里的runserver的 父类相同 所有 只是在原来的handle函数里多加了点属性 及校验是否配置ASGI_APPLICATION
源码中看到 handle中调用run() 然后调用了inner_run函数

原django runserver 的handle 是处理 default wsgi handler + staticfileHandler

区别在于获取了不同的application

最左侧为wsgi启动的服务
asgi 则通过daphne启动服务
本文详细解析了在Django 2.2环境中,如何自定义管理命令、设置本地启动流程,以及`runserver`与channel的关系。重点讲解了`--noreload`选项的影响和如何通过`ManagementUtility`执行自定义的app命令。

1767

被折叠的 条评论
为什么被折叠?



