Recentemente, me deparei com o mesmo problema. Aqui está a sinopse da minha solução:
Blocos básicos de código constituinte necessários
A seguir, estão os blocos de código básico necessários do seu aplicativo cliente
- Seção de solicitação de sessão: solicite uma sessão com o provedor
- Seção de autenticação de sessão: forneça credenciais ao provedor
- Seção Cliente: crie o Cliente
- Seção Cabeçalho de Segurança: adicione o Cabeçalho WS-Security ao Cliente
- Seção Consumo: consuma as operações disponíveis (ou métodos) conforme necessário
Quais módulos você precisa?
Muitos sugeriram o uso de módulos Python como o urllib2; no entanto, nenhum dos módulos funciona, pelo menos para este projeto em particular.
Então, aqui está a lista dos módulos que você precisa obter. Primeiro de tudo, você precisa baixar e instalar a versão mais recente do suds no seguinte link:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Além disso, você precisa fazer o download e instalar módulos de solicitações e suds_requests a partir dos seguintes links, respectivamente (aviso de isenção de responsabilidade: sou novo em publicar aqui, portanto não posso postar mais de um link no momento).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Depois de baixar e instalar esses módulos, você estará pronto.
O código
Seguindo as etapas descritas anteriormente, o código é semelhante ao seguinte: Importações:
import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests
Solicitação e autenticação de sessão:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Crie o cliente:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Adicione o cabeçalho WS-Security:
...
addSecurityHeader(client,username,password)
....
def addSecurityHeader(client,username,password):
security=Security()
userNameToken=UsernameToken(username,password)
timeStampToken=Timestamp(validity=600)
security.tokens.append(userNameToken)
security.tokens.append(timeStampToken)
client.set_options(wsse=security)
Observe que este método cria o cabeçalho de segurança descrito na Fig.1. Portanto, sua implementação pode variar dependendo do formato correto do cabeçalho de segurança fornecido pelo proprietário do serviço que você está consumindo.
Consumir o método (ou operação) relevante:
result=client.service.methodName(Inputs)
Registro :
Uma das melhores práticas em implementações como esta é o log para ver como a comunicação é executada. Caso haja algum problema, isso facilita a depuração. O código a seguir faz o log básico. No entanto, você pode registrar muitos aspectos da comunicação, além dos descritos no código.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Resultado:
Aqui está o resultado no meu caso. Observe que o servidor retornou o HTTP 200. Esse é o código de sucesso padrão para a solicitação-resposta HTTP.
(200, (collectionNodeLmp){
timestamp = 2014-12-03 00:00:00-05:00
nodeLmp[] =
(nodeLmp){
pnodeId = 35010357
name = "YADKIN"
mccValue = -0.19
mlcValue = -0.13
price = 36.46
type = "500 KV"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
(nodeLmp){
pnodeId = 33138769
name = "ZION 1"
mccValue = -0.18
mlcValue = -1.86
price = 34.75
type = "Aggregate"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
})