在Requests Python库中使用钩子时出现AttributeError
我正在发送请求,并把收到的响应对象放到一个钩子函数里。有时候,我会在这个函数里再发送一个新的请求,这样就会调用发送请求的那个函数(每个请求都会新开一个线程)。
这样做会在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
作为钩子传入的,如果你在找哪里出问题了。