【问题标题】:tornado curl http client CANNOT fetch binary filetornado curl http客户端无法获取二进制文件
【发布时间】:2013-09-22 13:20:49
【问题描述】:

我想从网站上获取图片(GIF 格式),所以我使用 tornado in-build 异步 http 客户端来做。我的代码如下:

import tornado.httpclient
import tornado.ioloop
import tornado.gen
import tornado.web

tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
http_client = tornado.httpclient.AsyncHTTPClient()

class test(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        content = yield http_client.fetch('http://www.baidu.com/img/bdlogo.gif')
        print('=====', type(content.body))

application = tornado.web.Application([
    (r'/', test)
    ])
application.listen(80)
tornado.ioloop.IOLoop.instance().start()

所以当我访问服务器时,它应该获取一个 gif 文件。但是它捕获了一个异常。

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 8: invalid start byte
ERROR:tornado.application:Uncaught exception GET / (127.0.0.1)
HTTPRequest(protocol='http', host='127.0.0.1', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1', headers={'Accept-Language': 'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate', 'Host': '127.0.0.1', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/20130922 Firefox/17.0', 'Connection': 'keep-alive', 'Cache-Control': 'max-age=0', 'If-None-Match': '"da39a3ee5e6b4b0d3255bfef95601890afd80709"'})
Traceback (most recent call last):
  File "/usr/lib/python3.2/site-packages/tornado/web.py", line 1144, in _when_complete
    if result.result() is not None:
  File "/usr/lib/python3.2/site-packages/tornado/concurrent.py", line 129, in result
    raise_exc_info(self.__exc_info)
  File "<string>", line 3, in raise_exc_info
  File "/usr/lib/python3.2/site-packages/tornado/stack_context.py", line 302, in wrapped
    ret = fn(*args, **kwargs)
  File "/usr/lib/python3.2/site-packages/tornado/gen.py", line 550, in inner
    self.set_result(key, result)
  File "/usr/lib/python3.2/site-packages/tornado/gen.py", line 476, in set_result
    self.run()
  File "/usr/lib/python3.2/site-packages/tornado/gen.py", line 505, in run
    yielded = self.gen.throw(*exc_info)
  File "test.py", line 12, in get
    content = yield http_client.fetch('http://www.baidu.com/img/bdlogo.gif')
  File "/usr/lib/python3.2/site-packages/tornado/gen.py", line 496, in run
    next = self.yield_point.get_result()
  File "/usr/lib/python3.2/site-packages/tornado/gen.py", line 395, in get_result
    return self.runner.pop_result(self.key).result()
  File "/usr/lib/python3.2/concurrent/futures/_base.py", line 393, in result
    return self.__get_result()
  File "/usr/lib/python3.2/concurrent/futures/_base.py", line 352, in __get_result
    raise self._exception
tornado.curl_httpclient.CurlError: HTTP 599: Failed writing body (0 != 1024)
ERROR:tornado.access:500 GET / (127.0.0.1) 131.53ms

它似乎试图将我的二进制文件解码为 UTF-8 文本,这是不必要的。如果我评论

tornado.httpclient.AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")

out,它将使用一个简单的http客户端而不是pycurl,效果很好。(它告诉我“内容”的类型是字节)

所以如果它返回一个字节对象,为什么它会尝试解码呢?我认为问题在于龙卷风中的 pycurl 或 pycurl 的包装器,对吧?

我的python版本是3.2.5,tornado 3.1.1,pycurl 7.19。

谢谢!

【问题讨论】:

    标签: python tornado libcurl pycurl asynchttpclient


    【解决方案1】:

    pycurl 7.19 不支持 Python 3。Ubuntu(可能还有其他 Linux 发行版)提供了一个修改后的 pycurl 版本,它部分适用于 Python 3,但它不适用于 Tornado (https://github.com/facebook/tornado/issues/671),并且失败一个看起来像您在这里看到的异常。

    在有正式支持 Python 3 的新版本 pycurl 之前(或者您使用 Tornado 错误报告中建议的更改),恐怕您需要回到 Python 2.7 或改用 Tornado 的 simple_httpclient。

    【讨论】:

    • 感谢您的回复!我试过了,pycurl 似乎有效。但是 tornado 期望 pycurl 将标头和正文作为字符串返回(现在它们是字节,因为它们应该是!)。所以看起来tornado不太像python3,在python3下运行需要很少的修改。我不是python专家,所以我选择放弃并改用简单的http客户端。还是谢谢你!
    • Tornado 的其余部分在 Python 3 上运行良好;只是 curl_httpclient 有问题。这些将在支持 Python 3 的官方 pycurl 版本发布后修复。
    • pycurl.sourceforge.net/doc/release-notes.html 似乎已更新为支持 python3
    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2011-03-07
    • 2013-10-27
    • 2019-07-27
    相关资源
    最近更新 更多