J'essaie de faire une application client Web en utilisant twisted mais ayant quelques problèmes avec les cookies. Est-ce que quelqu'un a un exemple que je peux regarder?en utilisant des cookies avec twisted.web.client
Répondre
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))
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
.
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()
Voulez-vous accepter l'une des réponses? –