2017-06-01 2 views
0

J'apprends Twisted en essayant de construire un agrégateur RSS. Lorsque je tente de construire des demandes à l'aide de l'agent Web, on me dit que je n'ai pas fourni l'argument url comme octets:Twisted Agent ne génère pas de requête à partir des octets

[Failure instance: Traceback (failure with no frames): <class 'twisted.web._newclient.RequestGenerationFailed'>: [<twisted.python.failure.Failure builtins.TypeError: sequence item 0: expected a bytes-like object, str found>] 

Mais je pense que je l'ai fait:

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

def request_sent(response): 
    print ('I got something!') 

def request_failed(reason): 
    print (reason) 

def feed_loader_main(): 
    """ 
    Starts and manage the reactor 
    """ 
    agent = Agent(reactor) 

    d = agent.request(
     'GET', 
     'http://www.example.com'.encode('utf8') ##### <- HERE 
    ) 

    d.addCallback(request_sent) 
    d.addErrback(request_failed) 

    print ('Firing reactor!') 
    reactor.run() 

if __name__ == '__main__': 
    feed_loader_main() 

Est-il tordu noir magie qui se passe ici ou juste un mauvais encodage de moi?

+0

Pouvez-vous modifier votre question et inclure les numéros de version Twisted et Python? Il y avait un problème avec 'Agent' et Python 3, mais je crois qu'il a été résolu il y a un moment. Néanmoins essayez de préfixer vos chaînes avec 'b' (si vous utilisez Python 3) – yorodm

Répondre

2

L'exception n'a pas réellement indiqué que vous n'avez pas fourni l'URL en tant qu'octets. Il a juste dit quelque part qu'il voulait octets et a obtenu str (unicode) à la place.

Je suppose que vous êtes sur Python 3 puisque je peux répliquer votre exception avec votre code sur Python 3 et pas sur Python 2. Je ne suis pas sûr de la version de Twisted que vous utilisez mais je soupçonne que c'est T terriblement Twisted-spécifique à la version. Néanmoins, c'est une bonne idée de spécifier les versions de Python et Twisted dans les prochaines questions.

L'autre valeur que vous transmettez à request est "GET" et sur Python 3, c'est un str (unicode). Si vous codez cela (ou si vous en faites un littéral avec b"..."), l'exception disparaît.

+0

Oui, c'était ça. J'utilise Python 3.5 et Twisted 17.0. Il m'a paru logique que le réacteur traite les URL comme des octets afin de construire la requête, mais je ne savais pas qu'il y avait une contrainte de codage sur les paramètres contextuels tels que GET (c'est pourquoi je ne pensais même pas que l'erreur pouvait viens de là). C'est un peu étrange. – Crolle

+0

Il me semble que ce serait mieux s'il y avait des constantes symboliques pour les différentes méthodes HTTP, par exemple 'GET' au lieu de' b "GET" ', etc. C'est un peu plus contraignant si quelqu'un veut émettre un verbe funky (ce qui est techniquement possible bien que probablement très rare). Cependant, le portage sur Python 3 a consommé la grande majorité de l'effort de développement de Twisted pendant de nombreuses années, de sorte que des améliorations de ce type ont pour la plupart été abandonnées. –

+0

Cela a du sens. Si jamais j'ai le temps, je vais essayer de faire une demande de traction. C'est une bonne opportunité de contribuer au code. – Crolle