SharePoint Server 2007 默认是使用ntlm协议验证用户登陆用户的,只使用python常用的WebService 工具包是无法通过NTLM验证的.经过研究,终于找到了完美的解决方案。
python-ntlm(官网地址:http://code.google.com/p/python-ntlm/)模块给urllib2模块提供了ntlm验证功能,而suds是基于urllib2实现的Web Service工具包,所以只要把两者结合来使用就可以实现python访问SharePoint Web Service的功能了。
经过研究suds的代码发现,suds是通过使用Transport进行基本的用户验证,它只提供了一个简单的HttpTransport。当然,这个HttpTransport是不支持NTLM验证,所以我实现了自已的WindowsTransport来解决这个问题。

WindowsTransport 1
#-*-coding=utf-8-*-
2
import urllib2 as u2
3
from suds.transport.http import *
4
from urlparse import urlparse
5
import urllib2
6
from ntlm import HTTPNtlmAuthHandler
7
8
class WindowsTransport(HttpTransport):
9
#类初始化
10
def __init__(self,url,username,password, **kwargs):
11
#调用基类初始化函数
12
HttpTransport.__init__(self,**kwargs)
13
#创建UrlOpener
14
self.urlopener=self.__buildOpener(url,username,password)
15
16
#创建UrlOpener对象,完成Ntlm用户验证
17
def __buildOpener(self,url,username,password):
18
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
19
passman.add_password(None, url, username, password)
20
# create the NTLM authentication handler
21
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(passman)
22
23
# create and install the opener
24
opener = urllib2.build_opener(auth_NTLM)
25
return opener
26
27
28
在代码里,WindowsTransport是继承HttpTransport,关键是通过python-ntlm的HTTPNtlmAuthHandler完成urlopener的创建,由这个opener里完成ntlm验证。
最后是测试代码:

Test
1
#用户名
2
username = 'FLYSUN\\Administrator'
3
#用户密码
4
password = "*******"
5
#访问url
6
url = "http://flysun/_vti_bin/sitedata.asmx"
7
wsdl=url+"?WSDL"
8
9
from suds import WebFault
10
from suds.client import *
11
from suds.transport.http import *
12
from WindowsTransport import *
13
14
transport= WindowsTransport(wsdl,username,password)
15
16
client = Client(wsdl ,transport=transport)
17
18
print client.wsdl
19
20
21
22
输出的结果:

Result
1
(Definitions){
2
id = "Definitions:0x406b918"
3
options = <suds.options.Options object at 0x01FD9770>
4
url = "http://flysun/_vti_bin/sitedata.asmx?WSDL"
5
tns[] =
6
"tns",
7
"http://schemas.microsoft.com/sharepoint/soap/",
8
types[] =
9
(Types){
10
definitions = (Definitions)
11
},
12







.
13







..