Python包装器无法获取响应对象类属性问题排查
排查
w.headers报错的问题 嘿,我来帮你揪出这个问题的根源!从你的描述来看,核心问题大概率出在自定义Response类的属性封装上,下面我分几个方向帮你排查:
1. 你的Response类没把headers作为实例属性暴露
最常见的情况是:你在封装Response对象时,没有把原始响应的headers赋值给实例的self.headers属性。比如如果你的Response类是这样写的:
class Response: def __init__(self, raw_response): self.raw = raw_response # 这里漏掉了给self.headers赋值!
那自然用w.headers会抛出“属性不存在”的错误(你描述的“headers not defined”应该是简化了报错信息,实际应该是类似'Response' object has no attribute 'headers')。
解决办法很简单,在Response的__init__里加上这行:
self.headers = raw_response.headers
这样就能直接通过w.headers访问响应头了。
2. headers被藏在了嵌套属性里
你提到“另一种语法可正常运行”,比如是不是用了w.raw.headers或者w.response.headers?如果是这样,说明你把原始响应的headers存在了Response对象的某个子属性里,而不是顶层。这时候要么调整封装逻辑把headers提到顶层,要么就接受嵌套访问——但显然你想要的是更简洁的w.headers,所以优先选前者。
3. 检查属性名的拼写或访问权限
- 有没有把
headers拼成了header或者别的错字? - 是不是把headers定义成了私有属性(比如
self._headers)?私有属性虽然也能访问,但不符合你的预期语法,而且规范上不建议直接访问。 - 如果用了
@property装饰器来定义headers,检查装饰器对应的方法名是不是写错了,比如:@property def headers(self): return self._response.headers # 这里要确保逻辑正确
快速排查小技巧
在报错的地方加一行代码,打印出w对象的所有属性,看看有没有headers:
w = SessionRequest().get("your-test-url") print(dir(w)) # 列出所有属性和方法 print(vars(w)) # 列出所有实例属性
如果输出里没有headers,那肯定是没定义;如果有,再检查它的值是不是你要的响应头字典。
举个完整的正确封装例子:
# api.py import requests class Response: def __init__(self, raw_resp): self.raw_response = raw_resp # 直接暴露headers属性 self.headers = raw_resp.headers # 其他你需要的属性,比如status_code、text等 self.status_code = raw_resp.status_code self.text = raw_resp.text class SessionRequest: def get(self, url): raw_resp = requests.get(url) return Response(raw_resp)
使用时:
from api import SessionRequest w = SessionRequest().get("https://example.com") print(w.headers.get("test")) # 就能正常获取test响应头了
内容的提问来源于stack exchange,提问作者MarkK
相关产品推荐
相关产品推荐

