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 ...
随机推荐
- iis下的php环境的配置
1. 参考园友文章: http://www.cnblogs.com/zengxiangzhan/archive/2010/03/05/1679286.html 2.另外还可以参考一下文章: http: ...
- 使用taro开发钉钉的E应用报错 You are currently using minified code outside of NODE_ENV === "production". This means that you are running a slower development build of Redux. You can use loose-envify (https://git
今天测试taro转钉钉E应用的时候,在模拟器上没事,但是在真机上却报错了: You are currently using minified code outside of NODE_ENV === ...
- 【Java并发编程五】信号量
一.概述 技术信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数据.计数信号量可以用来实现资源池或者给一个容器限定边界. 信号量维护了一个许可集,许可的初始量通过构造函数传 ...
- rabbitmq queue_declare arguments参数注释
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_26656329/article/details/77891793说明官方文档 在创建queue ...
- 机器学习实战-KNN
KNN算法很简单,大致的工作原理是:给定训练数据样本和标签,对于某测试的一个样本数据,选择距离其最近的k个训练样本,这k个训练样本中所属类别最多的类即为该测试样本的预测标签.简称kNN.通常k是不大于 ...
- 《转》python学习(12)-列表解析
转自 http://www.cnblogs.com/BeginMan/p/3164937.html 一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter ...
- Delphi应用程序的调试(二)使用断点
Delphi应用程序的调试(二)使用断点 使用断点(Using Breakpoints) 当用户从Delphi IDE 运行程序时,程序全速运行,只会在设置了断点的地方停住. New Term 断点( ...
- python中级---->pymongo存储json数据
这里面我们介绍一下python中操作mangodb的第三方库pymongo的使用,以及简单的使用requests库作爬虫.人情冷暖正如花开花谢,不如将这种现象,想成一种必然的季节. pymongo的安 ...
- JS - 二叉树算法实现与遍历 (更新中...)
一.关于二叉树: 截图来自:https://segmentfault.com/a/1190000000740261 温馨提示:学习以及使用二叉树概念,心中永远有这么一个图,对于理解和接受二叉树有很大的 ...
- javascript 闭包学习
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...