Chinaunix首页 | 论坛 | 博客
  • 博客访问: 887956
  • 博文数量: 380
  • 博客积分: 3495
  • 博客等级: 中校
  • 技术积分: 3996
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 09:35
文章分类

全部博文(380)

文章存档

2015年(2)

2014年(5)

2013年(9)

2012年(9)

2011年(67)

2010年(103)

2009年(182)

2008年(3)

我的朋友

分类: Python/Ruby

2013-07-25 21:49:44

P { margin-bottom: 0.08in; }A:link { }

接下来,就步入正题了, 从 manage.py runserver开始吧。

接前一章的分析,进入 django.core.management.commands.runserver

还好了,这个runserver.py里的Command类是继承自BaseCommand的,还是比较简单的。

那直接从handle方法开始吧。

可以看到方法是这样的

def handle(self, addrport='', *args, **options):

self.run(*args, **options)

def run(self, *args, **options):呢,会调用两种,一种是autoreload, 一种是self.inner_run,

实际上呢,autoreload只是在文件发生变化的时候,直接再load一下,都会调用到 inner_run

那么,就接着看inner_run吧。

首先还是常见的,

from django.conf import settings 《-导入settings

from django.utils import translation #这个有新意,是用于控制显示语言的。

下面这两句,才是真正的决定,用什么来处理http_request.


handler = self.get_handler(*args, **options)

run(self.addr, int(self.port), handler,

ipv6=self.use_ipv6, threading=threading)


handler是从get_internal_wsgi_application()来的,

不过这个在django.core.servers.basehttp.py中得到的处理,

我觉得是直接调用django.core.wsgi.py中的 get_wsgi_application()去了,而这个真正返回了

django.core.handlers.wsgi.WSGIHandler

先看一下整体的逻辑吧。


接下来的, 关于WSGIHandler的处理,涉及到了 PEP0333,也就是python wsgi的规范。

可以简单的说一下,关于server/gateway方面的定义,主要是 mod_wsgi来实现的,

关于 application/framework的,就是django实现的。

这部分呢,主要要求一个可调用的对象,

对于python来讲,可以是一个function, 一个class 或者说一个有__call__方法的instance.

那么WSGIHandler,很明显,就是一个有__call__方法的东东了。

处理肯定是掉入这里了。

参数嘛,就是我们能看到的。

class WSGIHandler(base.BaseHandler):


def __call__(self, environ, start_response):

environ:用于传递环境参数,是一个python内置的dictionary.

start_response:是一个可调用的对象。



再接下来分析一下关于BaseHandler吧,实际上这里有django 最核心的处理middleware的调用逻辑。

这里有一个很详细的说明。


process_request → process_view ->process_template_response ->process_response

中间,如果有process_request或者process_view产生了response, 那么后边的方法就不会接着调用了。

process_template_responseprocess_response 是必须要生成一个response的。


这个处理一直是由 WSGIHandlerBaseHandler两个类一起完成的。

首先是在 __call__中进行middleware的初始化的调用。

self.load_middleware()

BaseHandlerdef load_middleware(self)则是真正的按下面的分类,初始化了五类middleware, 上面的四类外,再加了一个exception_middleware.

self._view_middleware = []

self._template_response_middleware = []

self._response_middleware = []

self._exception_middleware = []


request_middleware = [] #这个最终被赋值给了 self._request_middleware


然后接下来,就是生成一个request, 这个是用WSGIRequest生成的,

再调用BaseHandler里的get_response方法,进行request的处理,也就是上面图中的处理。

这里可以很明显地的看到,先调用 self._request_middleware里的方法,

然后再调用 self._view_middleware, 这个前面,对url进行了分析, 然后把url 里定义参数,得出来准备在后边的view方法里,调用了。

如果都没有response,就调用callback, 也就是我们写的view 方法了。

随后开始中调用self._template_response_middleware

再整个方法的最后调用self._response_middleware

阅读(1724) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~