python - wsgi学习:PEP3333(笔记型文章)
摘要
用python做web开发,经常听到WSGI这个词,全称即:Python Web Server Gateway Interface 。wsgi是定义一套被提议的标准接品,该接口规范web servers(web服务器程序,如java领域的tomca)和python web applications或frameworks(基于python的web开发框架,如java领域的struts,springmvc等),目的就是增加基于python开发的web程序在不同web servers上可移植性。
如果是做jee开发人员,可以把wsgi理解成java领域的servlet规范,它定义了一套标准接口用于规范各servlets容器厂商的统一接口,这样遵守servlets规范的java web程序或框架就能在各个不同的servlets厂商实现的容器中(如tomcat,jetty,weblogic)运行并呈现一致性。重点要记住一点,wsgi即不是web server,也不是framework,它只是一套规范两者必需遵守的接口定义,就像servelt规范即不是tomcat,也不是strusts一样的道理。类比理解这个关系,对于之前是java开发人员来说,很容易理解。
WSGI规范概述
WSGI接口涉及两个方面:一面是:服务器(server)或网关(gateway),相对别一面是:应用程序(application)或框架(framework)。服务端运行由应用程或框架提供的可执行的对像实例,至于这个可执行对象的是如果获得的细节,不在WSGI规范定义之内,而是同server或gataway去处理。
相对于上面提到的两个方面(server和application),经常要引入一些中间件(middleware),这些中间件组件从不同的角度看其所起的角色作用也不同,相对server(服务器)来看,它像一个application(应用程序),而站在application的角度看middleware,它更像一个server逻辑在运行。java开发人员可以类比想象一件jee中的中间件,就知道怎么回事了。
application/framework端
application/framework端应该构建一个application对象实例,且该实例必需是可执行的,这里要注意的是:在python中一切皆对象,可执行的对象可以是函数,类,类实例(定义了__call__方法)。对于server/gateway接收到一次请求(request),理论上就应该调用运行一次application的处理方法。
如下是一个简单的application定义:
#applicaion.py def process(environ,start_response): status = '200 OK' response_headers = [('Content-type', 'text/plain')] start_response(status, response_headers) #server端实现逻辑 return "Hello,World!"
server/gateway端
#伪代码描述 out = socket.outstream #客户端连接流 def start_response(status,response_headers): #send 'status' and 'response_headers' out.write(status,'\r\n') out.write(response_headers) def run_with_cgi(application):#接收application可执行对象 result = application.process(environ,start_response) #write result to 'out' stream out.write(result)
Middleware(中间件),在上面提到的两端(application和server)都有角色扮演
class xml_to_html: def __init__(application): self.application = application def process(environ,start_response): result = self.application(environ,start_response) result = xslTool.parse(result) return result def run_with_cgi(xml_to_html(application)):#接收被xml_to_html这个中间件包装过的application可执行对象 #对于server和application来说,xml_to_html对两边的接口都是透明的