【问题标题】:Set useragent on Client __init__ (Python suds)在客户端 __init__ 上设置用户代理(Python suds)
【发布时间】:2012-03-15 17:11:54
【问题描述】:

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

WSDL 在服务器上仅适用于特定的用户代理。

谢谢

【问题讨论】:

    标签: python soap user-agent suds


    【解决方案1】:

    我不知道这是否是最简单的方法,但使用 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)
    

    【讨论】:

    • 太好了,这让我能够在尝试使用基本 suds 客户端进行查询时“修复”服务器端 Keep-Alive and Close may not be set using this property. 问题。
    【解决方案2】:

    你可以重写Transport类的u2opener方法来设置你自己的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)
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多