我们在使用Django 的时候,经常会使用一个django自带的本地测试小服务器。
django的自带这个测试小服务器基本都是通过wsgiref这个python的自带标准库实现,对其中模块进行了重写,我们先不在这里讨论,之后我看过wsgiref的源码后会贴出来的 - -。
写在前面
在开始之前,我们需要大致了解一些基础的内容
在一个 HTTP 请求到达服务器时, 服务器接收并调用 web 应用程序解析请求, 产生响应数据并返回给服务器. 这里涉及了两个方面的东西: 服务器(server)和应用程序(application).
关于applicaiton:
|
|
也可以是这样,
还可以是实例的方式
在这里 :
environ 是一个字典, 包含了环境变量
start_response 是一个回调函数
会在 app中被调用, 主要用来开始响应 HTTP. start_response ,大致是这样的
|
|
status 即状态码;
response_headers HTTP 头, 可以修改;
exc_info 是与错误相关的信息;
这个start_response主要就是再次封装了status和headers到response这个消息体中去
关于server服务器
在服务器方面, 可以想象最简单的工作就是调用 app()获取其结果的过程
|
|
在wsgiref中其实就是使用他创建一个simple_server
|
|
这里有一个点不是很懂就是为什么,在传入app之前,需要传递一个自身处理requesthandle的方法,WSGIRequestHandler呢?
python manager.py runserver 0.0.0.0:8000
先找到入口函数
大家都使用过python manager runserver 0.0.0.0:8000来测试我们的服务,但是我们的代码到底是怎么样的呢?
我们先找到runserver在哪里呢
|
|
在里面发现了很多关于commands的代码,打开每一个都看看,大致发一点规律,基本每个方法里面都有handle这个处理函数,进去看看先
让我们来看看handle
|
|
这里get_wsgi_application()最后就返回了一个方法,WSGIHandle这个类
就发现了这个东东
|
|
进入get_response,看看如何获取结果
|
|
现在我们终于看到了,wsgihandle最后处理的结果,就是这个response,当然中间还有很多异常检查,我已经忽略掉了
handle传递给我们的webserver
哈哈,似乎走的有点远
|
|
下来我们看看这个run是怎么个东东,应该会是server相关内容了
就是这个里面出来的,去看看是什么呢?
|
|
至于webserver使用的模块,大致了一下
问题
- wsgref实现出来的simple_server是个怎么样的webserver,这个需要看源码
- wsgiref下面的simple_server,接收了一个WSGIRequestHandler对像,为什么要这么接收
- 如果改用uwsgi或是其他的server,如何和主程序联合使用?
- 为什么要使用signal,会有哪些应用场景呢?