2009-09-09 64 views
3

我正在尝试使用扭曲的Web客户端应用程序,但在使用Cookie方面遇到了一些麻烦。有没有人有我能看的例子?使用cookies与twisted.web.client

+0

您想接受其中一个答案吗? – 2011-04-19 17:06:47

回答

2

原来没有简单的方法afaict 标题存储在twisted.web.client.HTTPClientFactory中,但不能从twisted.web.client.getPage()中获得,这是为撤回网页而设计的功能。我结束了重写功能:

from twisted.web import client 

def getPage(url, contextFactory=None, *args, **kwargs): 
    fact = client._makeGetterFactory(
     url, 
     HTTPClientFactory, 
     contextFactory=contextFactory, 
     *args, **kwargs) 
    return fact.deferred.addCallback(lambda data: (data, fact.response_headers)) 
7

虽然这是真的,getPage不会轻易允许请求或响应报头(的getPage怎么不是超级真棒API只是一个例子)的直接访问,饼干实际上支持。

cookies = {cookies: tosend} 
d = getPage(url, cookies=cookies) 
def cbPage(result): 
    print 'Look at my cookies:', cookies 
d.addCallback(cbPage) 

将发送字典中的任何cookie在传递到getPage时发送。服务器为响应请求而设置的任何新Cookie都将添加到字典中。

查看getPage时,您可能错过了此功能,因为getPage签名中没有任何参数cookies!但是,它确实需要**kwargs,并且这是如何支持cookies:传递给getPage的任何额外参数它不知道它自己,它传递到HTTPClientFactory.__init__。查看该方法的签名以查看您可以传递给getPage的所有内容。

1
from twisted.internet import reactor 
from twisted.web import client 

def getPage(url, contextFactory=None, *args, **kwargs): 
    return client._makeGetterFactory(
     url, 
     CustomHTTPClientFactory, 
     contextFactory=contextFactory, 
     *args, **kwargs).deferred 

class CustomHTTPClientFactory(client.HTTPClientFactory): 

    def __init__(self,url, method='GET', postdata=None, headers=None, 
       agent="Twisted PageGetter", timeout=0, cookies=None, 
       followRedirect=1, redirectLimit=20): 
     client.HTTPClientFactory.__init__(self, url, method, postdata, 
              headers, agent, timeout, cookies, 
              followRedirect, redirectLimit) 

    def page(self, page): 
     if self.waiting: 
      self.waiting = 0 
      res = {} 
      res['page'] = page 
      res['headers'] = self.response_headers 
      res['cookies'] = self.cookies 
      self.deferred.callback(res) 

if __name__ == '__main__': 
    def cback(result): 
     for k in result: 
      print k, '==>', result[k] 
     reactor.stop() 

    def eback(error): 
     print error.getTraceback() 
     reactor.stop() 

    d = getPage('http://example.com', agent='example web client', 
       cookies={ 'some' : 'cookie' }) 
    d.addCallback(cback) 
    d.addErrback(eback) 

    reactor.run()