龙卷风的AsyncHTTPClient子类

X世代

(python 3.6.4和龙卷风4.5.3)

当使用:http_client = tornado.httpclient.AsyncHTTPClient()时,异步http请求获取工作正常。

但是尝试定义和使用AsyncHTTPClient的子类会使我在运行程序时陷入某种僵局(与之相反,同步HTTPClient类的子类运行良好)

*请纠正我:如果Tornado的AsynchHTTPClient类遵循/继承自Configurable接口/抽象类,那么如何从中构建对象呢?(与Java中的规则相同?)。难道是某种东西在几个内置组件中为其选择了默认实现?

“可配置子类必须定义类方法configurable_base和configurable_default,并使用实例方法initialize而不是init。”-Will在继承的情况下,默认ctor将调用super。初始化这是问题的原因吗?

从文档中可以看出,不建议从AsyncHTTPClient继承/使用它不是有效的方法:

    http_client = AsyncHTTPClient()
    http_client.fetch("http://www.google.com/", handle_response)

该类的构造函数在几个方面具有魔力:它实际上创建了特定于实现的子类的实例,并且实例作为一种伪单例(每个.IOLoop重用关键字参数force_instance=True可用于禁止这种单例行为。除非force_instance=True使用,否则不应将任何参数传递给AsyncHTTPClient构造函数。可以使用静态方法设置实现子类及其构造函数的参数。configure()所有AsyncHTTPClient实现都支持defaults关键字参数,该关键字参数可用于设置HTTPRequest属性的默认值例如::

AsyncHTTPClient.configure(
    None, defaults=dict(user_agent="MyUserAgent"))
# or with force_instance:
client = AsyncHTTPClient(force_instance=True,
    defaults=dict(user_agent="MyUserAgent"))

其他问题:

1)是否可以选择缓冲响应?

3)什么时候应该使用tornado.web.RequestHandler类?


目前没有错误,但是在实际提取之后我没有收到响应。

import sys
from tornado import ioloop, gen, httpclient

在类SimpleAsyncHTTPClient(httpclient.AsyncHTTPClient)下:

#had to add this one (abstract function empty implementation? )
# I think that's the troublemaker
def fetch_impl(self, request, callback):
    pass

@gen.coroutine
def get(self, url):

    method = 'GET'
    print('send Async GET request ')
    res = yield self._fetch(url, method)
    print('after _fetch ...')
    return res

@gen.coroutine
def _fetch(self, url, method):
    print('send Asynchronous request ...')
    res = yield self.fetch(url, method=method)
    print('got a response')
    return res

在全球范围内:

@ gen.coroutine

def ioloop_task():

yield gen.sleep(3)
url = 'http://google.com'
http_client = SimpleAsyncHTTPClient()

res = yield http_client.get(url)
res_code =  res.code
res_body =  res.body
print('return code: {}, body: {}....'.format(res_code, res_body[:60]))

print('do other stuff ....')
yield gen.sleep(2)

print(' task completed')
木霉

由于您已经用其他详细信息更新了您的问题,并且它与原始问题变得非常不同,因此,我将添加另一个答案。

AsyncHTTPClient背后的魔力

考虑以下代码:

http_client = AsyncHTTPClient()
print(http_client.__class__)

# Output:
<class 'tornado.simple_httpclient.SimpleAsyncHTTPClient'>

如您所见,http_client是的实例SimpleAsyncHTTPClient,不是AsyncHTTPClient那么,这是怎么回事?

如果查看的源代码AsyncHTTPClient,您会看到它正在继承tornado.utils.Configurable该类。

在代码中最重要的一块Configurable类是__new__负责所有的魔术方法。如果查看其源代码,您会发现它将创建一个由classmethod返回的类的实例configurable_default

现在,查看的源代码AsyncHTTPClient.configurable_default它返回了SimpleAsyncHTTPClient类,这就是为什么我们在(http_client上方创建的对象是而SimpleAsyncHTTPClient不是的实例的原因AsyncHTTPClient

最后,是的,正确的是,您需要fetch_impl在子类中创建方法。因为AsyncHTTPClient会调用self.fetch_impl方法。您可以在源代码的这一行中看到此内容

虽然fetch_impl尚未在AsyncHTTPClient课程中实现,但已在中实现了SimpleAsyncHTTPClient你可以在这里找到它


如何成功继承AsyncHTTPClient

我将从查看源代码开始,SimpleAsyncHTTPClient然后对其进行修改以适合您的需求。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章