You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python requests POST请求传header触发AttributeError求助

问题根因

报错AttributeError: 'set' object has no attribute 'items'和引号类型没有任何关系,核心是你传入的header、data参数类型错误:

  • Python语法中,花括号{}包裹的内容如果是键: 值形式的键值对,才是字典类型;如果只是逗号分隔的独立值,会被识别为集合(set)类型。
  • 你写的header里,把每个请求头的键和值拼成了一整段字符串(比如'Content-Type: application/x-www-form-urlencoded'是一个完整字符串,没有拆成键'Content-Type'、值'application/x-www-form-urlencoded'的键值对结构);data里也犯了同样的错误,把每个参数的键值拼成了单个字符串。这两个变量实际都是集合类型,不是requests要求的字典。
  • requests处理headers、表单数据时,会调用字典自带的.items()方法遍历所有键值对,集合类型没有这个方法,直接触发报错。你后来把所有表单参数拼成一整个字符串放在花括号里,本质还是构造了一个只有1个元素的集合,当然还是报同样的错。
正确代码

对照你提供的cURL逻辑,requests传字典给data参数时会自动处理application/x-www-form-urlencoded格式的urlencode,和cURL的--data-urlencode效果完全一致,不需要手动拼接参数串,正确写法如下:

import requests
# 关闭verify=False时弹出的SSL警告,可选加
requests.packages.urllib3.disable_warnings()

endpoint = 'https://api.website/v1/token'
# headers为标准字典结构:键是请求头名称,值是请求头内容
headers = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Cache-Control': 'no-cache'
}
# data为标准字典结构:键是表单参数名,值是参数值,requests自动做编码处理
data = {
    'username': '<YourUsername>',
    'password': '<YourPassword>',
    'grant_type': 'password',
    'client_id': 'token-api' # 注意你原代码里client_id写的是api,和curl示例的token-api不一致,以接口实际要求为准
}
resp = requests.post(endpoint, headers=headers, data=data, verify=False)
# 打印响应状态码和内容调试
print(resp.status_code)
print(resp.text)
补充说明

如果你一定要手动拼接&连接的表单字符串,直接把字符串传给data参数即可,不要套花括号:

data = 'username=<YourUsername>&password=<YourPassword>&grant_type=password&client_id=token-api'

这种写法也能正常发起请求,但手动拼接需要自行处理特殊字符的URL编码,遇到用户名、密码带特殊字符的情况容易出问题,传字典的方式更稳妥。

内容的提问来源于stack exchange,提问作者Kaze

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:12:33