2017-06-01 8 views
0

Ich lerne Twisted, indem ich versuche, einen RSS agregator zu bauen. Wenn ich versuche, Anfragen zu bauen, die Web-Agenten verwenden, bin ich gesagt, dass ich nicht die URL Argument als Bytes vorsah:Twisted Agent wird keine Anfrage aus Bytes erstellen

[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>] 

Aber ich glaube, ich habe:

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() 

Ist es Twisted-schwarz Magie geht hier vor oder nur schlechte Kodierung von mir?

+0

Können Sie Ihre Frage bearbeiten und Twisted- und Python-Versionsnummern hinzufügen? Es gibt ein Problem mit "Agent" und Python 3, aber ich glaube, dass es vor einiger Zeit gelöst wurde. Versuchen Sie trotzdem, Ihre Strings mit 'b' zu versehen (wenn Sie Python 3 verwenden) – yorodm

Antwort

2

Die Ausnahme hat nicht wirklich gesagt, dass Sie die URL nicht als Byte angegeben haben. Es sagte nur irgendwo, dass es Bytes wollte und stattdessen str (Unicode) bekam.

Ich vermute, Sie sind auf Python 3, da ich Ihre Ausnahme mit Ihrem Code auf Python 3 und nicht auf Python 2 replizieren kann. Ich bin mir nicht sicher, welche Version von Twisted Sie verwenden, aber ich vermute, dass dies nicht ist Fürchterlich Twisted-Version-spezifisch. Dennoch ist es eine gute Idee, die Versionen von Python und Twisted in zukünftigen Fragen anzugeben.

Der andere Wert, den Sie an request übergeben, ist "GET" und auf Python 3, das ist ein Str (Unicode). Wenn Sie das kodieren (oder einfach ein Byte-Literal mit b"..." machen), dann verschwindet die Ausnahme.

+0

Ja, das war's. Ich benutze Python 3.5 und Twisted 17.0. Es machte irgendwie Sinn für mich, dass der Reaktor URLs als Bytes verarbeiten würde, um die Anfrage zu erstellen, aber ich wusste nicht, dass es eine Kodierungseinschränkung für kontextabhängige Parameter wie GET gab (deshalb konnte ich den Fehler nicht denken komm von dort). Es ist ein bisschen komisch. – Crolle

+0

Es scheint mir, als wäre es besser, wenn es symbolische Konstanten für die verschiedenen HTTP-Methoden gäbe, zB 'GET' anstatt' b "GET'' usw. Das ist etwas einschränkender für den Fall, dass jemand ein funkiges Verb ausgeben möchte (was technisch möglich ist, obwohl wahrscheinlich sehr selten). Die Portierung auf Python 3 hat jedoch den Großteil der Twisted-Entwicklungsbemühungen über viele Jahre hinweg in Anspruch genommen, so dass Verbesserungen wie diese größtenteils auf der Strecke geblieben sind. –

+0

Es macht Sinn. Wenn ich die Zeit habe, werde ich versuchen, eine Pull-Anfrage zu machen. Das ist eine gute Gelegenheit, zur Codebasis beizutragen. – Crolle