Python 我应该如何从circuits框架中获取其他URL?

Python 我应该如何从circuits框架中获取其他URL?,python,circuits-framework,Python,Circuits Framework,在Python3中,我应该如何从Circuits framework Controller中的一个方法中获取多个URL?这里有一个简单的例子,说明除了urllib3之外我想要什么。最好在开始时请求这两个URL,当它们都返回时,继续执行 # -*- coding: utf-8 -*- __author__ = 'jscarbor' import urllib3 from circuits.web import Server, Controller, Static http = urllib3.P

在Python3中,我应该如何从Circuits framework 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()

您需要使用与控制器不同的通道将circuits.web.client.client组件注册到控制器(因为客户端和服务器组件中的事件名称相同)。然后,您可以将请求事件触发到此通道并等待响应。 在您的特定示例中,您需要为请求事件注册一个处理程序,以便将其挂接到响应流程中。 我目前没有一个有效的示例,但这是一个起点的基础:

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()

我改进了你的要点,使它能做这些事情。我还不确定为什么不能同时触发两个请求事件,然后等待它们

#!/bin/env python3
from circuits.web.client import Client, request as request_event
from circuits.web import Server, Controller
from circuits import handler, Debugger


class Root(Controller):

    def index(self, event):
        request, response = event.args

        urls = [
            'https://www.w3.org/services/html2txt?url=http%3A%2F%2Fwww.example.com%2F',
            'http://home.hiwaay.net/~jimes/checklist.txt'
        ]
        events = []
        results = []
        for url in urls:
            event_ = request_event('GET', url)
            client = Client(channel=url)
            client.register(self)
            events.append((event_, client))
            self.fire(event_, url)
        #for event_, client in events:
            er = yield self.wait(event_, *event_.channels)
            client.unregister()
            results.append(er)

        response.headers["Content-Type"] = "text/plain"
        yield " ".join([r.value.read().decode("utf-8") for r in results])


(Server(8011) + Root() + Debugger()).run()

对代码的解释比(‘类似这样的东西’)更有用。@NanderSpeerstra更好?是的,更好!我已经改进了一点,但是我遇到了两个问题。这是新代码。如果我省略第29行,它似乎会依次获取每个URL,但它仍然显示404NotFound结果。如果我包括第29行来延迟等待,直到两个请求都得到处理,那么安全请求和不安全请求似乎被合并了。我看到这个错误:。。。文件“/usr/lib64/python3.5/ssl.py”,第633行,在do_handshake self.\u sslobj.do_handshake()操作错误:[Errno 9]错误的文件描述符想法?阻止并行获取两个URL的理想解决方案。