Django - WSGIHandler 的 start_response 和返回响应

2 投票
1 回答
2962 浏览
提问于 2025-04-17 17:29

我修改了我的问题,因为我意识到我把两个概念(WSGIHandler和中间件)混在一起了,这在这个问题中是不应该的。


我想对WSGIHandler的基本功能有一些了解。

django.core.handlers.wsgi.py

class WSGIHandler(base.BaseHandler):
initLock = Lock()
request_class = WSGIRequest

def __call__(self, environ, start_response):

    #...

    start_response(status, response_headers)
    return response

当调用WSGIHandler的实例时,会传入environstart_response这两个参数。
environ会用来创建request对象,这个对象是WSGIRequest的一个实例。

request = self.request_class(environ)

WSGIHandler.get_response会用来从request创建一个HttpResponse对象。

response = self.get_response(request)

我的问题:
start_response到底是干什么的?到这个时候,response对象已经创建好了。那么它开始的是什么响应呢?它是把响应发送到某个地方吗?而return response发送的响应又是发送到哪里去的(也就是说,通常是谁来调用它的)?

1 个回答

4

当你写一个网页应用时,你需要给服务器提供一个可以调用的东西,这样当有请求到达时,服务器就能调用它。这个可调用的东西负责生成一个响应,并把这个响应发送回服务器。然后,服务器再把这个响应发送回浏览器。

在Django中,这个可调用的东西就是 WSGIHandler。因为它定义了一个 __call__ 方法,所以服务器会调用这个 __call__ 方法。

传给 __call__ 的参数是来自服务器的。 start_response 也是一个可调用的东西,它是由服务器实现的。你不需要担心它是怎么实现的。因此, WSGIHandler__call__ 方法会调用这个 start_response

start_response 在内部创建了响应头,这些头部信息稍后需要发送回浏览器。但它只是设置了一些服务器上的属性,并没有把响应发送回浏览器。它并不把响应发送到任何地方。

在调用 start_response 后,WSGI处理器会在 return response 这一行返回实际的响应。当这行代码执行时,服务器会检查这个响应是否合适,然后根据响应的情况,要么发送在 start_response 中设置的 cookies,要么抛出一些异常。

想了解更多信息,可以查看 http://www.python.org/dev/peps/pep-0333/

撰写回答