(能不能开个专栏?允许的字数不够啊)
摘要: 基于django version 1.11.0 . alpha版本

新的一篇,大概梳理一下django的url路由流程与runserver的启动流程。

小公举小姐姐们,求赞求转发,要抱抱

分析代码首先找到分析入口,根据由入口开始的处理流程,定位到要分析的节点。

一般调试运行django使用manager命令:

根据上一回的django命令系统的分析

找到runserver命令(django/core/management/commands/runserver.py)

runserver命令调用链为self.handle->self.run->self.inner_run->run

run函数(servers/basehttp.py):

分析run函数,定义了一个httpd_cls类,继承WSGIServer以及ThreadingMinIn,之后初始化,调用serve_forever函数开始监听端口。

监听端口接收请求之后会交由_handle_request_noblock函数处理,最终请求会发送到上图run函数中的WSGIRequestHandler类处理:

RequestHandlerClass就是run方法中的WSGIRequestHandler,WSGIRequestHandler的基类__init__函数会自动调用self.handle方法。

那接着来看一下self.handle:

self.handle调用ServerHandler的run方法,self.server.get_app()得到的就是basehttp.py 中run函数中httpd.set_app(wsgi_handler)中的wsgi_handler,即core/wsig.py中的get_wsig_application函数(此时执行django.setup函数,做app加载),见下图

至此python manager.py runserver 0:80命令启动server的工作基本完成了。在server接到request请求之后会自动将请求交给WSGIHandle类(注:根据wsgi协议,WSGIHandler是callable的,WSGIHandler在初始化的时候执行了load_middleware函数,加载中间件)处理。通过WSGIHandle的get_response函数相应request请求。

1 收藏


直接登录
最新评论