当前位置: 首页 > 知识库问答 >
问题:

如何在Python3上使用tornado代理大型内容?

魏熠彤
2023-03-14

我试图实现异步超文本传输协议反向代理与Python3上的龙卷风。

处理程序类如下:

class RProxyHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous
    def get(self):
        backend_url = 'http://backend-host/content.html'   # temporary fixed

        req = tornado.httpclient.HTTPRequest(
                                    url=backend_url)
        http_client = tornado.httpclient.AsyncHTTPClient()
        http_client.fetch(req, self.backend_callback)

    def backend_callback(self, response):
        self.write(response.body)
        self.finish()

当content.html很小时,这段代码工作正常。但是对于content.html,这段代码会引发异常:

ERROR:tornado.general:Reached maximum read buffer size

我找到了用pycurl处理大型内容的方法。不过,它似乎不适用于Python3。

此外,我还向HTTPRequest添加了streaming_回调选项。但当后端服务器禁用分块响应时,将不会调用回调。

我如何处理大的内容?

谢谢

共有1个答案

东门翰
2023-03-14

您应该能够将max\u buffer\u size传递给tornado.httpclient.asynchtpclient()调用以设置最大缓冲区大小。对于50MB缓冲区:

import tornado.ioloop
import tornado.web
from tornado.httpclient import AsyncHTTPClient
from tornado import gen
from tornado.web import asynchronous


class MainHandler(tornado.web.RequestHandler):
    client = AsyncHTTPClient(max_buffer_size=1024*1024*150)

    @gen.coroutine
    @asynchronous
    def get(self):
        response = yield self.client.fetch("http://test.gorillaservers.com/100mb.bin", request_timeout=180)
        self.finish("%s\n" % len(response.body))

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

更新:现在是一个完整的示例程序

 类似资料:
  • 问题内容: 我正在制作一个运行ASP.NET WebService的Android应用程序。Webservice发送一个JSON对象,应用程序解析该对象并显示在屏幕上。在一种情况下,JSON对象太大,并且出现Findered Binder Transaction错误。我的解决方案是获取该JSON对象并将其嵌入到应用程序代码中,这样就无需从服务器获取该JSON对象。你能告诉我我可以做的其他事情吗?还

  • 问题内容: 众所周知,代理对象时,例如为Spring / EJB创建具有事务属性的Bean时,甚至当您使用某些框架创建部分模拟时,代理对象都不知道,内部调用也不会重定向,然后也没有被拦截… 这就是为什么如果您在Spring中做类似的事情: 当您致电doSomething时,您希望除了主要交易外还有3个新交易,但是实际上,由于这个问题,您只会得到一个新交易… 所以我想知道您如何处理此类问题… 实际上

  • 我正在使用Python 3.2。1并且我无法导入模块。我使用可以工作,但我不能将它与的一起使用,如下所示: 我得到以下错误: 当我写时,它说

  • 问题内容: 如何从Java处理内存?我知道Java在它自己的JVM中运行,因此它不能直接访问进程内存。 我听说过JNA,可用于获取操作系统和Java代码之间的接口。 假设我要操纵纸牌得分。尝试将是这样的: 得到纸牌的过程 获得对单人纸牌的记忆 找出分数存储在存储器中的位置 在地址中写下我的新值 Java本身无法访问该内存,那么如何使用JNA做到这一点? 问题答案: 您需要使用JNA库。下载两个Ja

  • 问题内容: 我有一个带有数据库和相应的 models.py 文件的现有Django应用程序。 我有一个新的Tornado应用程序,可以为其他应用程序提供Web服务。它需要从同一数据库读取/写入,并且我要使用的模型文件中有代码。 如何在Tornado请求处理程序中最好地使用Django数据库和模型?它像建立到 models.py Django项目文件夹的符号链接,导入Django模块并使用它那样简单

  • 本文向大家介绍Python3 urllib.request.urlretrieve如何下载文件或图片以及如何使用代理?,包括了Python3 urllib.request.urlretrieve如何下载文件或图片以及如何使用代理?的使用技巧和注意事项,需要的朋友参考一下 使用urllib.request.urlretrieve方式: 如果要使用代理,需要先导入:socket和httplib2.so