Django - WSGIHandler 的 start_response 和返回响应
我修改了我的问题,因为我意识到我把两个概念(WSGIHandler和中间件)混在一起了,这在这个问题中是不应该的。
我想对WSGIHandler
的基本功能有一些了解。
django.core.handlers.wsgi.py
class WSGIHandler(base.BaseHandler):
initLock = Lock()
request_class = WSGIRequestdef __call__(self, environ, start_response): #... start_response(status, response_headers) return response
当调用WSGIHandler
的实例时,会传入environ
和start_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 个回答
当你写一个网页应用时,你需要给服务器提供一个可以调用的东西,这样当有请求到达时,服务器就能调用它。这个可调用的东西负责生成一个响应,并把这个响应发送回服务器。然后,服务器再把这个响应发送回浏览器。
在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/。