我应该如何从 Python 3 的 Circuits 框架 Controller 中的一个方法中获取多个 URL?这是我想要的一个简单示例,除了 urllib3。最好在开始时请求两个 URL,当它们都返回时,继续执行。
# -*- coding: utf-8 -*-
__author__ = 'jscarbor'
import urllib3
from circuits.web import Server, Controller, Static
http = urllib3.PoolManager()
class Root(Controller):
def index(self):
self.response.headers["Content-Type"] = "text/plain"
a = http.request('GET', 'https://www.w3.org/services/html2txt?url=http%3A%2F%2Fwww.example.com%2F').data
b = http.request('GET', 'http://home.hiwaay.net/~jimes/checklist.txt').data
return "%s %s" % (a, b)
(Server(8011) + Root()).run()
请您参考如下方法:
您需要使用与 Controller 不同的 channel 将 circuits.web.client.Client 组件注册到您的 Controller (因为事件名称在客户端和服务器组件中相同)。然后您可以将请求事件发送到此 channel 并等待响应。 在您的特定示例中,您需要为请求事件注册一个处理程序以挂接到响应过程。 我目前没有工作示例,但这是一个起点的基础:
from circuits.web.client import Client, request as request_event
from circuits.web import Server, Controller
from circuits import handler
class Root(Controller):
@handler('request')
def _on_request(self):
a = yield self.wait(request_event('GET', 'https://www.w3.org/services/html2txt?url=http%3A%2F%2Fwww.example.com%2F'), channel='url-fetching')
b = yield self.wait((request_event('GET', 'http://home.hiwaay.net/~jimes/checklist.txt'), channel='url-fetching')
self.response.headers["Content-Type"] = "text/plain"
self.response.body = "%s %s" % (a.value.read(), b.value.read())
(Server(('0.0.0.0', 8011)) + Root() + Client(channel='url-fetching').run()