【问题标题】:AttributeError using hooks in Requests Python packageAttributeError 在 Requests Python 包中使用钩子
【发布时间】:2014-08-04 12:36:02
【问题描述】:

我正在发送请求并将其响应对象接收到挂钩函数中。 有时,我会从同一个函数中发送一个新请求,该函数又会调用发送请求的函数(每个请求都有一个新线程)。

这会在 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'

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

注意:我看过这个问题,但我的问题不同:Problems with hooks using Requests Python package

【问题讨论】:

  • 你返回了一个布尔值,requests 期望一个响应对象。但是,如果没有您的代码,则无法说明更有意义的内容。
  • self.http_callback 定义在哪里?

标签: python python-2.7 python-requests attributeerror


【解决方案1】:

异常点之前的行写着:

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

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

或者,如果您不想更改响应,请返回 None

来自event hooks documentation

如果回调函数返回一个值,则假定它是替换传入的数据。如果该函数没有返回任何内容,则不执行任何其他操作。

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

修复你的钩子。从你的回溯中我们可以看到你传入self.http_callback作为钩子,如果你想知道去哪里看的话。

【讨论】:

  • FWIW,我不确定我们的文档在这方面是否正确。我得检查一下。
  • @sigmavirus24:当前的implementation of hooks 看起来仍然适合文档。返回None 并且对传入的初始值不做任何事情,返回一些东西并替换该值。
  • @sigmavirus24: 唯一改变了钩子的东西(自 2012 年 12 月 Kenneth 上次重构钩子以来)是额外支持从原始 .get().post() 传入任意关键字参数等调用已注册的钩子。那是在February 2013..
  • 嗯,异常来自请求代码本身。我更深入地查看了它,似乎 Requests 使用了我的回调函数的return 并在其中搜索history 属性。在某些情况下,我的函数返回 bool,这不是必需的,因此我将其删除,它应该可以解决问题。但是,在请求中为此添加一些错误处理可能会很好,不是吗?
  • 我告诉过你为什么异常来自requests:因为你的钩子违反了它预期的记录返回值。当库代码抛出异常时,你总是需要验证你没有传递给它无效数据。
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2018-03-28
相关资源
最近更新 更多