django2.2启动流程源码解析

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

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启动服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值