2017-06-01 69 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