2009-09-09 4 views

Répondre

2

Il s'avère qu'il n'y a pas de moyen facile afaict Les en-têtes sont stockés dans twisted.web.client.HTTPClientFactory mais non disponible auprès de twisted.web.client.getPage() qui est la fonction conçue pour extraire une page Web. J'ai fini par la réécriture de la fonction:

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

Il est vrai que getPage ne permet pas facilement accès direct aux en-têtes de demande ou de réponse (juste un exemple de la façon dont getPage n'est pas une API super génial), les cookies sont réellement soutenu.

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

Tous les cookies dans le dictionnaire quand il est passé à getPage sera envoyé. Tous les nouveaux cookies que le serveur définit en réponse à la demande seront ajoutés au dictionnaire.

Vous avez peut-être manqué cette fonctionnalité en regardant getPage car la signature getPage n'a pas de paramètre cookies n'importe où! Cependant, il prend **kwargs, et c'est ainsi que cookies est pris en charge: tous les arguments supplémentaires passés à getPage qu'il ne connaît pas lui-même, il passe à HTTPClientFactory.__init__. Jetez un oeil à la signature de cette méthode pour voir toutes les choses que vous pouvez passer à 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() 
Questions connexes