2017-06-01 73 views
0

我正在學習扭曲嘗試構建RSS聚合器。當我嘗試建立使用Web代理請求,有人告訴我,我沒有提供URL參數爲字節:扭曲的代理將不會建立字節的請求

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

但我認爲我所做的:

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

我猜你是在Python 3上,因爲我可以用你的代碼在Python 3上而不是在Python 2上覆制你的異常。我不確定你使用了什麼版本的Twisted,但是我懷疑這是不是'非常扭曲版本特定。不過,在將來的問題中指定Python和Twisted的版本是一個好主意。

你傳遞給request的另一個值是"GET",在Python 3上,這是一個str(unicode)。如果你對它進行編碼(或者只是將其與b"..."一起作爲字節文字),則異常消失。

+0

是的,就是這樣。我使用Python 3.5和Twisted 17.0。對我來說,反應器會將URL的字節處理爲構建請求的方式對我有意義,但是我不知道對上下文參數(如GET)有編碼約束(這就是爲什麼我甚至不認爲錯誤可能會來自那裏)。這有點奇怪。 – Crolle

+0

在我看來,如果對於不同的HTTP方法存在符號常量,比如'GET'而不是'b「GET」'等等,這會更好一些,這樣在有人想發出時髦動詞這在技術上可行,但可能非常罕見)。然而,移植到Python 3已經佔用了Twisted開發工作的絕大多數多年,所以像這樣的改進已經大部分被忽略了。 –

+0

它是有道理的。如果我有時間,我會盡量提出拉請求。這是爲代碼庫做出貢獻的好機會。 – Crolle