WEB开发网
开发学院软件开发Python Python Web 服务开发者 第 8 部分: Python SOAP 库... 阅读

Python Web 服务开发者 第 8 部分: Python SOAP 库,第 3 部分

 2008-09-30 13:00:25 来源:WEB开发网   
核心提示: 不幸的是,要利用这一技术,Python Web 服务开发者 第 8 部分: Python SOAP 库,第 3 部分(5),您需要给在模块中定义的每个函数都添加这一逻辑, 清单 4 采用了一种更为通用的方法,通用对象请求代理体系结构)和 XML-RPC,另外还有一个用 pickle 库写成

不幸的是,要利用这一技术,您需要给在模块中定义的每个函数都添加这一逻辑。 清单 4 采用了一种更为通用的方法,对于您在一个模块内定义的所有函数,这种方法允许您轻松的将其定义在一个名称空间内。您可以相当轻松的在多个名称空间中定义同一个方法,或者定义名称空间各不相同的多个方法(只要方法名是相同的)。为了达到这一目的,叫做 _functionMap 的函数一般会利用映射字典映射请求。字典的主键是名称空间,每个条目指向一个函数,当接收到与函数相对应的名称空间里的请求时就调用这个函数。然后,为了能看到模块内最上层函数(按照 ZSI 的要求),您可以使用简单的 lambda 来代表真正的函数定义。对于 getMonth , getMonth lambda 就会被调用;它再调用 _functionMap 查看调用的名称空间以及可用的函数映射。如果发现匹配的情况,就调用函数;反之,则发出异常。现在,要给模块添加新的函数,您要定义函数和对应的 lambda。

注意一点:您需要在每个 lambda 定义的缺省参数中都放上一个对 _functionMap 的引用。这是因为,您在创建好 lambda 时希望删除模块对 _functionMap 函数的引用;如果不删除的话,那么这个函数将会被公开在您的 Web 服务接口上,因为对于任何在最上层定义的方法,ZSI 都允许它被调用。

清单 4 展示文件 zsi-ns-server.py , 它用 ZSI 实现了可以知道名称空间的服务器。

清单 4. zsi-ns-server.py:更为通用的方法

#!/usr/bin/env python
import sys, calendar
#Import the ZSI machinery
from ZSI import dispatch
CAL_NS = "http://uche.ogbuji.net/eg/ws/simple-cal"
#The actual implementations
def getMonth(year, month):
  return calendar.month(year, month)
def getYear(year):
 return calendar.calendar(year)
#Generic function to check the namespace
def _functionMap(name,mapping,*args):
 cb = dispatch.GetClientBinding()
 func = mapping.get(cb.GetNS())
 if func is None:
  raise TypeError, "Unimplemented method %s %s" % (cb.GetNS(),name)
 return apply(func,args)
#Publicly defined methods
getMonthMap = {CAL_NS:getMonth,
        }
getMonth = lambda year,month,_functionMap=_functionMap,map=getMonthMap:_functionMap
("getMonth",map,year,month)
getYearMap = {CAL_NS:getYear,
       }
getYear = lambda year,_functionMap=_functionMap,map=getYearMap:_functionMap("getYear",map,year)
#Delete this so it is not available as a service.
del _functionMap
 
print "Starting server..."
dispatch.AsServer(port=8888)

在不久的将来

在这一专栏的下一部分中,我们将对一些不同的分布式编程技术进行比较,并分析每种技术具有的一些性能特征。我们将比较 SOAP、CORBA(Common Object Request Broker Architecture,通用对象请求代理体系结构)和 XML-RPC,另外还有一个用 pickle 库写成的自助实现。我们还要看一下消息的开销、应用程序的内存占用量、消息传送次数及实现这些方法中的每一种所需要的有关源代码的大小。

上一页  1 2 3 4 5 

Tags:Python Web 服务

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接