Python Web 服务开发者 第 8 部分: Python SOAP 库
2007-03-29 12:23:34 来源:WEB开发网这个客户机的实现与第五篇专栏文章中的 curses 客户机的类似。需要注意一点, SOAPProxy 的 namespace(名称空间)参数被注释掉了。正如 ZSI 客户机的缺省实现无法知道名称空间一样,服务器的同样也无法知道。
要运行样本脚本,请在一个窗口中再次启动 ZSI 服务器:
python zsi-server.py
在另一个窗口中启动 SOAP.py 客户机:
python soappy-client.py
如您所愿(因为这个客户机是为了与 ZSI 服务器通信而特地编写的),返回给您的正是 2002 年 2 月的日历。
ZSI 和名称空间
在接下去的测试中,您要扩展 ZSI 客户机以便它能支持名称空间内的多个方法。要实现这一目的需要克服一些困难;但是 ZSI 包的作者 Rich Salz 说,很快就可以支持方法的名称空间了。他说,我的设想是通过 Python 2.2 中的一个新功能,这个功能允许您任意给函数定义属性。如果您在函数定义上添加了 namespace 属性,那么 ZSI 指派代码就会查询这个属性以判定在哪个名称空间中定义了方法。为了将来引用,您可以通过将属性设置在函数对象上给函数添加任何属性。下面是一个很短的示例:
>>> def foo(a):
... pass
...
>>> foo.namespace = "http://foo.com"
>>> print foo.namespace
http://foo.com
>>>
Salz 还提到,他会添加对除名称空间信息以外的关于函数的其它属性(比如参数类型信息)的支持。这样 ZSI 就可以在函数被调用之前对传入的参数进行类型检查。
不管在任何情况下,要知道 ZSI 服务器的名称空间,您需要给 getMonth 方法(以及其它任何我们希望放在名称空间中的方法)添加一点逻辑。对于当前的的调用,您可以先添加一个 ClientBinding 试试。它包含有关调用的所有相关信息,包括其名称空间在内。(缺省情况下,ZSI 将忽略名称空间。)然后,您可以将 ClientBinding 的名称空间同您所期望的名称空间进行比较。如果匹配,那么您可以返回正确的结果;反之,您可以抛出异常,异常内容为:方法未定义。 清单 3 展示重构的 getMonth 方法的一个示例。
更多精彩
赞助商链接