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

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

 2007-03-29 12:23:34 来源:WEB开发网   
核心提示: 清单 3. 重构的 getMonth 方法def getMonth(year, month):cb = dispatch.GetClientBinding()if cb.GetNS() != CAL_NS:raise TypeError, "Unimplemented metho

清单 3. 重构的 getMonth 方法

def getMonth(year, month):
 cb = dispatch.GetClientBinding()
 if cb.GetNS() != CAL_NS:
  raise TypeError, "Unimplemented method %s %s" % (cb.GetNS(),name)
 return calendar.month(year, month)

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

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

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

上一页  1 2 3 4 5 6  下一页

Tags:Python Web 服务

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