django源码笔记-【1】(转)
add by zhj:第二段代码有修改
原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371181.html
前言
Django是一个开放源代码的Web应用框架,她像一个工具箱,包括了整个web开发中的各种技术,例如ORM,Template等。这是在阅读django的源码中作的笔记。
首先需要简要介绍以下WSGI。
WSGI
基本概念
wsgi是Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。 在此接口中有两个方面,一个web应用程序类比java中的war包,一个是web服务器类比tomcat,apache。在这里我们只关注web应用程序。 参考http://www.python.org/dev/peps/pep-0333/
在此接口中定义了一个服务器和应用程序通信的方法:

#file: app.py
def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello world!\n']

服务器传递两个参数:environ,start_response到我们的应用程序中,我们根据自己的业务逻辑处理后, 调用start_response返回相应代码和响应头信息,并在方法的最后返回相应的内容。假设将此app.py部署在 服务器上,那么用户访问时,服务器将会返回 Hello world 字符串,并带着相应头信息。
实例
此处我们建立了一个应用程序也就是app,为该app创建一个view,另外值得注意的是middleware。 middleware和app是类似的东西,只不过它对于app的view实现了一个decorator的模式,看代码就明白了。

import eventlet.wsgi def view_def(env, response_call):
status = '200 ok'
response_headers = [('Content-type', 'text/plain')]
response_call(status, response_headers )
return 'hello ' class handler(object):
def __init__(self, view):
self._view = view def __call__(self, env, start_response):
pre_middle = pre_middle(self._view)
view_res = self._view(env, start_response)
post_middle = post_middle(self._view)
res = "%s %s %s" %(pre_middle.res,view_res,post_middle.res) return res class pre_middle(object):
def __init__(self,view):
print 'before app process...I run'
self.res = "pre middle.." class post_middle(object):
def __init__(self,view):
print 'after app process...I run too'
self.res = "..post middle" port = 1234
sock = eventlet.listen(('0.0.0.0', port))
handler_instance = handler(view_def)
eventlet.wsgi.server(sock, handler_instance)

代码思路: 创建一个view(view_def),给view包裹Middleware(pre_middle、post_middle),然后开启一个服务器(eventlet)并监听1234端口,若有请求,那么系统的处理顺序是:
Request -> pre_middle -> view_def -> post_middle -> Response
运行结果
运行脚本:

在浏览器中浏览http://0.0.0.0:1234/可以看到以下效果

后台输出:

验证了我们的想法。
下一篇将会介绍django中是如何实现WSGI的。o(∩∩)o...
django源码笔记-【1】(转)的更多相关文章
- django源码笔记-【2】(转)
add by zhj: 在原文的基础上有修改 原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371238.html 上一期完理解了WSGI处理 ...
- Django 源码阅读笔记(基础视图)
django源码解读之 View View. ContextMixin.TemplateResponseMixin.TemplateView.RedirectView View class View( ...
- Django 源码小剖: 初探 WSGI
Django 源码小剖: 初探 WSGI python 作为一种脚本语言, 已经逐渐大量用于 web 后台开发中, 而基于 python 的 web 应用程序框架也越来越多, Bottle, Djan ...
- Django 源码小剖: Django ORM 查询管理器
ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...
- Django 源码小剖: Django 对象关系映射(ORM)
引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...
- Django 源码小剖: 响应数据 response 的返回
响应数据的返回 在 WSGIHandler.__call__(self, environ, start_response) 方法调用了 WSGIHandler.get_response() 方法, 由 ...
- Django 源码小剖: 更高效的 URL 调度器(URL dispatcher)
效率问题 django 内部的 url 调度机制说白了就是给一张有关匹配信息的表, 这张表中有着 url -> action 的映射, 当请求到来的时候, 一个一个(遍历)去匹配. 中, 则调用 ...
- Django 源码小剖: URL 调度器(URL dispatcher)
在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...
- Django 源码小剖: 初探中间件(middleware)
因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装. BaseH ...
随机推荐
- postgreSQL连接 java接口
1.下载PostgreSQL JDBC驱动: http://jdbc.postgresql.org/download.html 2. 新建一个java项目,导入下载的jar包Add External ...
- 【调试错误】找不到 System.Web.Mvc 引用
今天调试新项目,从svn上clone下来,发现运行不了. System.Web.Mvc 显示黄色叹号 解决方案如下: 安装一个 MVC 的插件.AspNetMVC2_VS2008.exe 下载地址:h ...
- Python六大开源框架对比:Web2py略胜一筹(转)
Python是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准库也是值得大家称赞的,Python甚至还自带 ...
- UINavigationItem 设置UIBarButtonItem
转:http://hi.baidu.com/ivan_xu/item/237bb1ad77eff9b028ce9d7c 有A.B两个ViewController,假如A push B: UINavig ...
- Linux账号和密码文件 /etc/passwd和/etc/shadow
Linux系统中,所有用户(包括系统管理员)的账号和密码都可以在/etc/passwd和/etc/shadow这两个文件中找到,(用户和密码就放在文件中,不怕被其他人看的或者修改吗?/etc/pass ...
- Jrebel不生效的原因和解决办法
一.问题原因和解决办法 我这里用的是idea,装了jrebel.之前用的好好的. 后边新建了一个project,不知道为啥,感觉总是不生效,虽然显示class reload了,但感觉还是没起作用. 后 ...
- C程序设计语言习题(3-3)
编写函数expand(s1,s2), 将字符串s1中类似于a-z一类的速记符号在字符串s2中扩展为等价的完整列表abc……xyz.该函数可以处理大小写字母和数字,并可以处理a-b-c.a-z0-9与a ...
- linux中守护进程启停工具start-stop-daemon
1.功能作用 启动和停止系统守护程序 2.位置 /sbin/start-stop-daemon 3.主要参数 Commands: -S|--start -- <argument> ... ...
- 23种设计模式之命令模式(Command)
命令模式是一种对象的行为型模式,类似于传统程序设计方法中的回调机制,它将一个请求封装为一个对象,从而使得可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是对命 ...
- Core Data 迁移与版本管理
原文 http://chun.tips/blog/2014/11/28/core-data-ban-ben-qian-yi-jing-yan-zong-jie/ 主题 Core DataiOS开发 ...