2009-09-09 3 views
3

트위스트를 사용하는 웹 클라이언트 애플리케이션을 만들려고하지만 쿠키에 문제가 있습니다. 누구든지 내가 볼 수있는 모범을 보았습니까?twisted.web.client와 쿠키 사용하기

+0

답변 중 하나를 수락 하시겠습니까? –

답변

2

는 웹 페이지를 다시 당겨 설계된 기능입니다 쉬운 AFAICT 헤더가 twisted.web.client.HTTPClientFactory에 저장되는 방식하지만 twisted.web.client.getPage에서 사용할 수 없습니다()가 없다 밝혀졌습니다. 이 getPage 쉽게 (getPage 슈퍼 멋진 API 아닌 방법의 한 예를) 요청 또는 응답 헤더에 직접 액세스를 허용하지 않는 것을 사실이지만, 쿠키가

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

: 나는 기능을 다시 작성 결국 실제로 지원됩니다.

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

getPage으로 전달 된 사전의 쿠키가 전송됩니다. 요청에 대한 응답으로 서버가 설정 한 모든 새 쿠키가 사전에 추가됩니다.

getPage 서명에 cookies 매개 변수가 없으므로 getPage을보고 싶을 때이 기능을 놓칠 수 있습니다. 그러나 **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()