2009-09-09 68 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()