【问题标题】:passing custom data to exceptions in request_futures将自定义数据传递给 request_futures 中的异常
【发布时间】:2015-06-14 04:17:28
【问题描述】:

我正在运行以下代码来发出异步“获取”请求。 CustomSession 类用于添加对每个请求的计时支持。

如果发生异常或请求运行正常,我希望能够访问附加到futures 列表的test_id,以及要请求的 URL。换句话说,当请求运行或抛出异常时,我想找到与对session.get 的调用关联的test_id

from datetime import datetime
from requests_futures.sessions import FuturesSession

class CustomSession(FuturesSession):

    def __init__(self, *args, **kwargs):
        super(CustomSession, self).__init__(*args, **kwargs)
        self.timing = {}

    def request(self, method, url, *args, **kwargs):
        background_callback = kwargs.pop('background_callback', None)
        test_id = kwargs.pop('test_id', None)

        # start counting
        self.timing[test_id] = datetime.now()

        def time_it(sess, resp):
            # here if you want to time the server stuff only
            self.timing[test_id] = datetime.now() - self.timing[test_id]
            if background_callback:
                background_callback(sess, resp)
            # here if you want to include any time in the callback

        return super(CustomSession, self).request(method, url, *args,
                                                  background_callback=time_it,
                                                  **kwargs)


session = CustomSession()

futures = []
for url in ('http://httpbin.org/get?key=val',
            'http://httpasdfasfsadfasdfasdfbin.org/get?key2=val2'):

    futures.append(session.get(url, test_id=1))
for future in futures:
    try:
        r = future.result()
        print(r.status_code)
    except Exception as e:
        print(e)

【问题讨论】:

    标签: python python-3.x python-requests concurrent.futures


    【解决方案1】:

    我为future对象的result()函数创建了一个装饰器:

    def mark_exception(fn, id, url):
        def new_fn(*args, **kwargs):
            try:
                return fn(*args, **kwargs)
            except:
                raise Exception("test id %d with url %s threw exception" % (id, url))
        return new_fn
    

    并在您的 CustomSession.request() 函数的末尾应用它,替换原来的 return 语句:

    future =  super(CustomSession, self).request(method, url, *args,
                                              background_callback=time_it,
                                              **kwargs)
    future.result = mark_exception(future.result, test_id, url)
    return future
    

    输出:

    200
    test id 1 with url http://httpasdfasfsadfasdfasdfbin.org/get?key2=val2 threw exception
    

    我希望这会有所帮助。

    编辑:

    如果您想获得每个未来的测试ID,您可以通过以下两种方式:

    futures = []
    for url in ('http://httpbin.org/get?key=val',
                'http://httpasdfasfsadfasdfasdfbin.org/get?key2=val2'):
        tid = 1
        future = session.get(url, test_id=tid)
        # option 1: set test_id as an attrib of the future object
        future.test_id = tid
        # option 2: put test_id and future object in a tuple before appending to the list
        futures.append((tid, future))
    for tid, future in futures:
        try:
            r = future.result()
            print("tracked test_id is %d" % tid) #option 2
            print("status for test_id %d is %d" % (future.test_id, r.status_code)) #option 1
        except Exception as e:
            print(e)
    

    【讨论】:

    • 谢谢!你得到赏金(只要它让我奖励它)。我如何通过test_id 来获得成功的请求(不仅仅是一个例外)?我想通过r.test_id 或类似的方式获得它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2019-11-07
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    相关资源
    最近更新 更多