0. 前言
基本概念:
WSGI:全称是Web Server Gateway Interface
,WSGI
是一种规范,用来描述web server
如何与web application
通信的规范。server
和application
的规范在PEP 3333中有具体描述。要实现WSGI协议,必须同时实现web server和web application,当前运行在WSGI
协议之上的web
框架有 Flask
, Django等
。
WSGI协议主要包括server
和application
两部分:
WSGI server
负责从客户端接收请求,将request
转发给application
,将application
返回的response
返回给客户端;WSGI application
接收由server
转发的request
,处理请求,并将处理结果返回给server
。application
中可以包括多个栈式的中间件(middlewares
),这些中间件需要同时实现server与application,因此可以在WSGI服务器与WSGI应用之间起调节作用:对服务器来说,中间件扮演应用程序(执行程序),对应用程序来说,中间件扮演服务器(WSGI服务器)。
WSGI
协议其实是定义了一种server
与application解耦
的规范,即可以有多个实现WSGI server
的服务器,也可以有多个实现WSGI application
的框架,那么就可以选择任意的server
和application
组合实现自己的web
应用。例如uWSGI
和Gunicorn
都是实现了WSGI server
协议的服务器,Django
,Flask
是实现了WSGI application
协议的web
框架,可以根据项目实际情况搭配使用。
注:
- 贴图代码都只是截取了关键入口的那部分关键语句和函数方法, 其他细节可看详细代码,我们把主流程走一遍就行了 。
- 我每个标记了粉红色加粗文字的都是那一步或者几小步的主要工作,前面标了序号,完了可以把他们串联起来,就是一个完整的流程了。
一. 程序入口:runserver命令
python manage.py runserver 0.0.0.0:8000
注:runserver文件里的Command类继承了Django的BaseCommand,从而可以通过python manage.py <文件名> 运行该文件,命令运行的函数为handle()
文件地址:
/<我自己的虚拟环境地址>/lib/python3.7/site-packages/django/core/management/commands/runserver.py
注:可以找到文件从这里开始查看源码
- <1>执行runserver命令handle()时调用run()方法:
- 执行run()时调用inner_run()方法:
- 执行inner_run()时<2>调用WSGI的入口函数run(): </