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对两边的接口都是透明的

 

 

posted @ 2012-10-24 23:36  海鸟  阅读(2274)  评论(0编辑  收藏  举报