Django - WSGIHandler start_response并返回响应

时间:2013-02-28 20:53:57

标签: python django django-views

我编辑了我的问题,因为我意识到我正在结合两个概念(WSGIHandler和Middleware) 我不应该在这个问题中加入。


我试图对WSGIHandler的作用有一些基本的了解
django.core.handlers.wsgi.py

  

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

def __call__(self, environ, start_response):

    #...

    start_response(status, response_headers)
    return response

将使用WSGIHandlerenviron参数调用start_response的实例 environ将用于创建request对象,该对象是WSGIRequest的一个实例。

request = self.request_class(environ)

WSGIHandler.get_response将用于从HttpResponse创建request对象。

response = self.get_response(request)

我的问题:
start_response做了什么?到目前为止,已经创建了response个对象。那么它的反应是什么呢?它会在某处发送一些响应吗?它在哪里发送return response发送的响应(即通常调用它的是什么?)?

1 个答案:

答案 0 :(得分:2)

编写Web应用程序时,需要向服务器提供callable,服务器将在请求到达时调用该服务器。此可调用负责生成响应并将响应发送回服务器。服务器轮流将此响应发送回浏览器。

在django的情况下,可调用的是WSGIHandler。由于它已定义__call__,因此服务器将调用此__call__

发送给__call__的参数来自服务器。 start_response也是可调用的,由服务器实现。您无需担心其实现。因此,__call__ WSGIHandler会调用此可调用start_response

start_response在内部创建标题,稍后必须将其发送回浏览器。但它只在服务器上设置了一些属性,它不会将响应发送回浏览器。它不会在任何地方发送任何响应。

调用start_response后,wsgi处理程序返回行return response中的实际响应。执行此行时,服务器会检查响应是否正确,然后根据响应发送start_response调用中设置的cookie或引发某些操作。

查看http://www.python.org/dev/peps/pep-0333/了解详情。