2017-06-01 2 views
0

RSSアグレゲータを構築しようとするとTwistedを学んでいます。Twisted Agentはバイトからリクエストを構築しません

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

しかし、私は私がやったと思う:私は、Webエージェントを使用して要求を構築しようとした際、私は私がバイトとしてURL引数を提供しなかったことを聞いてい

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

それはツイスト黒です魔法はここで起こっているのか、それとも私からの貧弱なエンコーディングは?

+0

質問を編集してTwistedとPythonの両方のバージョン番号を入力してください。 'Agent'とPython 3には問題がありますが、もう少し前に解決されたと思います。それにもかかわらず、あなたの文字列の先頭に 'b'をつけてみてください(もしあなたがPython 3を使っているのであれば) – yorodm

答えて

2

例外は実際にあなたがバイトとしてURLを提供していないとは言いませんでした。ちょうどどこかでバイトが必要だと言われ、代わりにstr(ユニコード)があります。

あなたの例外はPython 3ではなくPython 2で複製することができるので、あなたはPython 3を使用していると思います。使用しているTwistedのバージョンはわかりませんが、ひどくツイストバージョン特有のものではない。それにもかかわらず、将来の質問ではPythonとTwistedのバージョンを指定することをお勧めします。

requestに渡される他の値は"GET"で、Python 3ではstr(ユニコード)です。それをエンコードした場合(またはバイトリテラルをb"..."にすると)、例外はなくなります。

+0

そうです。私はPython 3.5とTwisted 17.0を使用しています。原子炉が要求を構築するためにURLをバイトとして処理するとは、何とか私には意味がありましたが、GETなどのコンテキストパラメータのエンコーディングの制約があることはわかりませんでした。そこから来る)。それはちょっと変だ。 – Crolle

+0

異なるHTTPメソッドのための記号定数があると良いと思います。たとえば、 'b 'GET' 'などの代わりに' GET'などです。これは誰かがファンキーな動詞を出そうとしている場合には、おそらく非常にまれですが技術的に可能です)。しかし、Python 3への移植は、何年もの間、Twisted開発作業の大部分を費やしていました。 –

+0

意味があります。もし私が時間があれば、私はプルのリクエストをしようとします。これはコードベースに貢献する良い機会です。 – Crolle

関連する問題