我是龙卷风的新手。
我想要的是编写一些函数来异步获取网页。由于这里没有请求处理程序,应用程序或服务器,我想我可以单独使用tornado.httpclient.AsyncHTTPClient。 但是所有示例代码似乎都在龙卷风服务器或请求处理程序中。当我试图单独使用它时,它永远不会起作用。 例如:
def handle(self,response):
print response
print response.body
@tornado.web.asynchronous
def fetch(self,url):
client=tornado.httpclient.AsyncHTTPClient()
client.fetch(url,self.handle)
fetch('http://www.baidu.com')
它说''str'对象没有属性'application'“,但我试图单独使用它?
或:
@tornado.gen.coroutine
def fetch_with_coroutine(url):
client=tornado.httpclient.AsyncHTTPClient()
response=yield http_client.fetch(url)
print response
print response.body
raise gen.Return(response.body)
fetch_with_coroutine('http://www.baidu.com')
也不起作用。
之前,我尝试将回调传递给AsyncHTTPHandler.fetch,然后启动IOLoop,它可以工作并打印网页源代码。但我无法弄清楚如何处理ioloop。
答案 0 :(得分:1)
@tornado.web.asynchronous
只能应用于RequestHandler
子类中的某些方法;它不适合这种用法。
您的第二个示例是正确的结构,但您需要实际运行IOLoop。在批处理式程序中执行此操作的最佳方法是IOLoop.current().run_sync(fetch_with_coroutine)
。这将启动IOLoop,运行您的回调,然后停止IOLoop。您应该在run_sync()
中运行单个函数,然后在该函数中使用yield
来调用任何其他协程。
有关更完整的示例,请参阅https://github.com/tornadoweb/tornado/blob/master/demos/webspider/webspider.py
答案 1 :(得分:1)
以上是我过去使用过的一个例子......
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
AsyncHTTPClient.configure(None, defaults=dict(user_agent="MyUserAgent"))
http_client = AsyncHTTPClient()
def handle_response(response):
if response.error:
print("Error: %s" % response.error)
else:
print(response.body)
async def get_content():
await http_client.fetch("https://www.integralist.co.uk/", handle_response)
async def main():
await get_content()
print("I won't wait for get_content to finish. I'll show immediately.")
if __name__ == "__main__":
io_loop = IOLoop.current()
io_loop.run_sync(main)
我还详细介绍了如何将Pipenv与tox.ini和Flake8一起使用此龙卷风示例,以便其他人能够更快地启动和运行https://gist.github.com/fd603239cacbb3d3d317950905b76096