在Requests Python库中使用钩子时出现AttributeError

-3 投票
1 回答
1563 浏览
提问于 2025-04-18 09:44

我正在发送请求,并把收到的响应对象放到一个钩子函数里。有时候,我会在这个函数里再发送一个新的请求,这样就会调用发送请求的那个函数(每个请求都会新开一个线程)。

这样做会在Requests模块里产生以下异常:

Exception in thread Thread-103:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/api.py", line 272, in thread_func
    r = self.session.post(url, data=params, headers=headers, timeout=60, hooks=dict(response=self.http_callback))
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 425, in post
    return self.request('POST', url, data=data, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 383, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/sessions.py", line 494, in send
    if r.history:
AttributeError: 'bool' object has no attribute 'history'

我觉得这很奇怪。你知道可能发生了什么吗?

注意:我看过这个问题,但我的问题不同:使用Requests Python包的钩子问题

1 个回答

2

在异常发生之前的那一行是:

r = dispatch_hook('response', hooks, r, **kwargs)

你的钩子返回了一个布尔值,但它应该返回一个响应对象。布尔值没有history属性,而响应对象是有的。

如果你不想改变响应,可以返回None

根据事件钩子的文档

如果回调函数返回了一个值,系统会认为这是要替换传入的数据。如果函数什么都不返回,那么就不会有其他影响。

传入response钩子的值是响应对象;替换的值也应该是一个响应对象。

修复你的钩子。从你的错误追踪信息中,我们可以看到你把self.http_callback作为钩子传入的,如果你在找哪里出问题了。

撰写回答