在客户端__init__上设置useragent(Python suds)

时间:2012-03-15 17:11:54

标签: python soap user-agent suds

我想知道如何在Python中使用suds在所有SOAP请求中设置useragent,包括WSDL get。 的确,在以下代码中: 客户端(的 'http:// ......') WSDL是使用默认的Python useragent。

WSDL仅在特定用户的服务器上可用。

谢谢

2 个答案:

答案 0 :(得分:2)

我不知道这是否是最简单的方法,但使用httplib2肯定是可行的(这个技巧也可以让你保持连接):

from suds.transport import Transport
import httplib2, StringIO

class Httplib2Response:
    pass
class Httplib2Transport(Transport):

    def __init__(self, **kwargs):
        Transport.__init__(self)
        self.http = httplib2.Http()

    def send(self, request):
        url = request.url
        message = request.message
        headers = request.headers
        headers['User-Agent']='XYZ'
        response = Httplib2Response()
        response.headers, response.message = self.http.request(url,
                "PUT", body=message, headers=headers)

        return response

    def open(self, request):
        response = Httplib2Response()
        request.headers['User-Agent']='XYZ'

        response.headers, response.message = self.http.request(request.url, "GET",
            body=request.message, headers=request.headers)
        return StringIO.StringIO(response.message)

然后你需要将传输类传递给suds.client:

http = Httplib2Transport()
client = Client(url,transport=http)

答案 1 :(得分:0)

您可以覆盖u2opener类的Transport方法来设置自己的addheaders属性:

class HttpTransportCustomUserAgent(HttpTransport):

    def __init__(self, **kwargs):
        self.user_agent = kwargs.get('user_agent', 'Python-urllib/%s' % urllib2.__version__)
        if 'user_agent' in kwargs:
            del(kwargs['user_agent'])
        HttpTransport.__init__(self, **kwargs)

    def u2opener(self):
        """
        Create a urllib opener.
        @return: An opener.
        @rtype: I{OpenerDirector}
        """
        if self.urlopener is None:
            result = urllib2.build_opener(*self.u2handlers())
            result.addheaders = [('User-agent', self.user_agent)]
            return result
        else:
            return self.urlopener

现在您可以将这个新的传输类用于suds.client:

http = HttpTransportCustomUserAgent(user_agent='My custom User Agent')
client = Client(url, transport=http)