python无法访问suds方法

我想在python中使用SUDS来访问SOAP API

from suds.client import Client def initialize(): url = 'http://uuuuuuuuuuuuuuu.com/wewewe/WsNBI?wsdl' username = 'xxxxx' password = 'ppppppp' client = Client(url) print client result = client.service.Login(nbiLogin NBILogin(username,password),) print result 

我无法调用login方法,任何想法我可以做到这一点?

这些是查询返回的方法…

 Suds ( https://fedorahosted.org/suds/ ) version: 0.4 GA build: R699-20100913 Service ( WsNBIService ) tns="www.test.com" Prefixes (1) ns0 = "www.test.com" Ports (1): (WsNBIPort) Methods (5): GetClientAssociationInfo(nbiSession NBISession, clientAssociationReqData ClientAssociationReqData, ) GetEvent(nbiSession NBISession, eventReqData EventReqData, ) GetZDClientAssociationInfo(nbiSession NBISession, clientAssociationReqData ClientAssociationReqData, ) Login(nbiLogin NBILogin, ) Logout(nbiSession NBISession, ) Types (22): GetClientAssociationInfo GetClientAssociationInfoResponse GetEvent GetEventResponse GetZDClientAssociationInfo GetZDClientAssociationInfoResponse Login LoginResponse Logout LogoutResponse authenticateResult clientAssociationDetail clientAssociationReqData clientAssociationResult eventDetail eventReqData eventResult eventType nbiLogin nbiResult nbiSession requestType 

更新:

 #!/usr/bin/env python from suds.client import Client def initialize(): url = 'http://xxxxxxx/xxxx/WsNBI?wsdl' username = 'xxxxx' password = 'pppppp' client = Client(url) login = client.factory.create("ns0:NBILogin") print login ws = login.nbiLogin(userName=username, password = password) result = client.service.Login(ws) print result def main(): initialize() if __name__ == "__main__": main() [root@server scripts]# ./flex_soap.py (nbiLogin){ UserName = None Password = None } Traceback (most recent call last): File "./flex_soap.py", line 19, in ? main() File "./flex_soap.py", line 16, in main flexMaster() File "./flex_soap.py", line 12, in flexMaster ws = login.nbiLogin(userName=username, password = password) AttributeError: nbiLogin instance has no attribute 'nbiLogin' 

更新:

 #!/usr/bin/env python from suds.client import Client def initialize(): url = 'http://xxxxx/intune/WsNBI?wsdl' username = 'uuuuu' password = 'pppp' client = Client(url) print client login = client.factory.create("ns0:NBILogin") print login login.UserName = username login.Password = password result = client.service.Login(login) print result event = client.factory.create("ns0:EventReqData") print event def main(): initialize() if __name__ == "__main__": main() [root@server scripts]# ./flex_soap.py (nbiLogin){ UserName = None Password = None } (authenticateResult){ Success = True Session = (nbiSession){ Id = "0eda1622-473c-4dd6-b68e-4ff3c1ee27f6" } } (eventReqData){ EventType = (eventType){ value = None } SerialNumbers = (SerialNumbers){ SerialNumber[] = <empty> } } 

任何想法如何我可以得到这种方法

 GetEvent(nbiSession NBISession, eventReqData EventReqData, ) 

你的代码不是一个有效的Python。 Login(nbiLogin NBILogin, )意味着有一个方法Login接受一个NBILogin类型的NBILogin 。 这不是你应该使用的字面语法。 尝试这样的事情:

  login = client.factory.create("ns0:NBILogin") login.UserName = username login.Password = password result = client.service.Login(login) 

这个输出:

 (authenticateResult){ Success = True Session = (nbiSession){ Id = "0eda1622-473c-4dd6-b68e-4ff3c1ee27f6" } } 

意味着result.Success == True and result.Session.Id == "0eda1622-473c-4dd6-b68e-4ff3c1ee27f6"

GetEvent(nbiSession NBISession, eventReqData EventReqData, )表示需要2个NBISessionEventReqData类型的参数。

你可以从result获得的会话。 构建EventReqData

 (eventReqData){ EventType = (eventType){ value = None } SerialNumbers = (SerialNumbers){ SerialNumber[] = <empty> } } 

你需要创建EventTypeSerialNumbers

 event_req_data = client.factory.create("ns0:EventReqData") event_req_data.EventType = "put some appropriate event type here" event_req_data.SerialNumbers = [10, 51, 1] # some serial numbers 

上面假定序列号是整数,否则通过client.factory.create()与所有其他对象一样创建每个SerialNumber

 sns = event_req_data.SerialNumbers = client.factory.create('ns0:SerialNumbers') for item in [10, 51, 1]: ns = client.factory.create('ns0:SerialNumber') ns.value = item sns.SerialNumber.append(ns) 

我没有在列表中看到SerialNumbersSerialNumber类型,所以它可能会失败。

如果client.factory.create()将字符串转换为EventType ,那么你可以使用client.factory.create()明确地创建EventType

 event_type = client.factory.create("ns0:EventType") event_type.value = "put some appropriate event type here" event_req_data.EventType = event_type 

拨打电话:

 event = client.service.GetEvent(login.Session, event_req_data)