声明:
本博客欢迎转发,但请保留原作者信息!内容系本人学习、研究和总结,如有雷同,实属荣幸!
原文地址:http://blog.csdn.net/gtt116/
Django是一个开放源代码的Web应用框架,她像一个工具箱,包括了整个web开发中的各种技术,例如ORM,Template等。这是在阅读django的源码中作的笔记。
首先需要简要介绍以下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,另外值得注意的是 filter或是middleware。 filter和app是类似的东西,只不过它对于app实现了一个decorator的模式,看代码就明白了。
import eventlet.wsgi def app_def(env, response_call): status = '200 ok' response_headers = [('Content-type', 'text/plain')] response_call(status, response_headers ) return 'hello ' class Middle(object): def __init__(self, app): self._app = app def __call__(self, env, start_response): middle_res = "middle process.." print 'before app process...I run' middle_res = "%s %s" %(middle_res, self._app(env, start_response)) print 'after app process...I run too' return middle_res port = 1234 sock = eventlet.listen(('0.0.0.0', port)) middleware = Middle(app_def) eventlet.wsgi.server(sock, middleware)
代码思路: 创建一个app(app_def),给app包裹一个Middleware(Middle),然后开启一个服务器(eventlet)并监听1234端口,若有请求,那么系统的处理顺序是:
Request -> Middle -> app_def -> Middle -> Response
为什么有两次调用Middle呢,看Middle中的__call__方法,“before app process”就是第一次调用,在调用完self._app(env,start_response)后,调用“after app process”,其实就是一个decorator模式,你可以将这两个处理封装起来用另外的函数完成。
运行脚本:
在浏览器中浏览http://0.0.0.0:1234/可以看到以下效果
后台输出:
验证了我们的想法。
下一篇将会介绍django中是如何实现WSGI的。