天天看点

django流程简析

浅析 Django 处理流程 和 结构分析 django 收藏

在Python 的Web 框架中,Django 是比较成功的。

它是一个高级Python web framework ,鼓励快速开发和干净的、MVC 设计。

包括一个模板系统,对象相关的映射和用于动态创建管理界面的框架。支持ORM 、Cache 、 i18n 、Admin 等众多特性,是为了满足“Deadlines” 项目而开发的。

先介绍一下目录结构:

conf: 主要有两个作用:1) 处理全局配置, 比如数据库、加载的应用、MiddleWare 等 2) 处理urls 配置, 就是url 与view 的映射关系。

contrib: 由Django 的开发者贡献的功能模块,不过既然都已经随版本发布,就表示是官方的。

core: Django 的核心处理库,包括url 分析、处理请求、缓存等,其中处理请求是核心了,比如处理fastcgi 就是由wsgi.py 处理。

db: 顾名思义,处理与数据库相关的,就是ORM 。

dispatch: 其实这不是Django 原创,是pydispatch 库,主要处理消费者- 工作者模式。

forms newforms oldforms: 处理html 的表单,不用多介绍。

middleware: 中间件,就是处理HTTP 的request 和response 的,类似插件。比如默认的common 中间件的一个功能:当一个页面没有找对对应的pattern 时,会自定加上‘/’ 重新处理。比如访问/blog 时,而定义的pattern 是‘^blog/$’ ,所以找不到对应的pattern ,会自动再用/blog/ 查找,当然前提是APPEND_SLASH=True 。

template: Django 的模板,我个人认为这块是非常有创意的。

templatetags: 处理Application 的tag 的wrapper ,就是将INSTALLED_APPS 中所有的templatetags 目录添加到 django .templatetags 目录中,则当使用 {{load blog}} 记载tag 时,就可以使用 import django .templatetags.blog 方式加载了。不过这有一个问题,如果其他Application 目录中也有blog.py ,这会加载第一个出现blog.py 的tag 。其实在 Django 中,有许多需要处理重名的地方,比如template ,需要格外小心,这个后续在介绍。

utils: 公共库,很多公用的类都在放在这里。

views: 最基本的view 方法。

Django 几个重要的概念:

Project: 指一个完整的Web 服务,一般由多个模块组成。

Application: 可以理解为模块,比如用户管理、博客管理等,包含了数据的组成和数据的显示,Applicaiton 都需要在project/settings.py 中INSTALLED_APPS 的定义。

Middleware: 就是处理request 和response 的插件, Middleware 都需要在project/settings.py 中MIDDLEWARE_CLASSES 的定义。

Loader: 模板加载器, 其实就是为了读取Template 文件的类,默认的有通过文件系统加载和在Application/template 目录中加载,Loader 都需要在project/settings.py 中TEMPLATE_LOADERS 的定义。

下面以fastcgi 方式为例,Django 的版本是“0.97-pre-SVN-7053″ 。

其实和其他Web 框架一样,HTTP 处理的流程大致相同( 但和Tomcat 等Java 容器不相同) ,

比如request->response.

0) 加载配置

Django 的配置都在Project/settings.py 中定义,可以是Django 的配置,也可以是自定义的配置,并且都通过django .conf.settings 访问,非常方便。

1) 启动

最核心动作的是通过django .core.management.commands.runfcgi 的Command 来启动,它运行django .core.servers.fastcgi 中的runfastcgi ,runfastcgi 使用了flup 的WSGIServer 来启动fastcgi 。而WSGIServer 中携带了django .core.handlers.wsgi 的WSGIHandler 类的一个实例,通过WSGIHandler 来处理由Web 服务器( 比如Apache ,Lighttpd 等) 传过来的请求,此时才是真正进入Django 的世界。

2) 处理 Request

当有HTTP 请求来时,WSGIHandler 就开始工作了, 它从 BaseHandler 继承而来。WSGIHandler 为每个请求创建一个WSGIRequest 实例,而WSGIRequest 是从 http.HttpRequest 继承而来。接下来就开始创建Response 了.

3) 创建 Response

BaseHandler 的get_response 方法就是根据request 创建 response ,而具体生成response 的动作就是执行urls.py 中对应的view 函数了,这也是Django 可以处理“ 友好URL” 的关键步骤,每个这样的函数都要返回一个Response 实例。此时一般的做法是通过loader 加载template 并生成页面内容,其中重要的就是通过ORM 技术从数据库中取出数据,并渲染到Template 中,从而生成具体的页面了

4) 处理 Response

Django 返回Response 给flup ,flup 就取出Response 的内容返回给Web 服务器,由后者返回给浏览器。