AttributeError:“str”对象没有属性“items”

Posted

技术标签:

【中文标题】AttributeError:“str”对象没有属性“items”【英文标题】:AttributeError: 'str' object has no attribute 'items' 【发布时间】:2013-09-22 22:58:08 【问题描述】:

在以下代码中:

#!/usr/local/bin/python
import json

APPLICATION_NAME = 'cc9226315643df89-36bf02429075329d0ba36748360d050c'

HEADERS1 = json.dumps(dict(Destination = u"/api/af/latest/applications/%s/rulesets" % (APPLICATION_NAME)))
print "Headers1 is %s" % (HEADERS1)
HEADERS2 = 'Destination': '/api/af/latest/applications/%s/rulesets' % (APPLICATION_NAME)
print "Headers2 is %s" % (HEADERS2)

我得到以下输出:

Headers1 is "Destination": "/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets"
Headers2 is 'Destination': '/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets'

但是当我尝试在使用 requests() 的 REST 调用中使用 HEADER1 或 HEADER2 时,我得到了非常不同的结果:

SERVER_URL = 'http://1.1.33.109:8087%s' % (APP_PATH)
REQ_DATA = None
print "Headers are: ", HEADERS
print "SERVER_URL is: ", SERVER_URL
print "Request Data is:", REQ_DATA
print ""

RESPONSE = requests.request(
    'MOVE', 
    SERVER_URL, 
    auth = ('admin', 'admin'), 
    verify = False, 
    data = REQ_DATA,
    headers = HEADERS1 )     #<-- If I use HEADER1 it breaks, if I use HEADER2 it works
print "Move Ruleset back to the Application RESULT: %s\n" % (RESPONSE)

我通过 HEADER1 得到以下信息:

Traceback (most recent call last):
   File "./myrest.py", line 234, in <module>
     headers = HEADERS1 )
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 44, in request
     return session.request(method=method, url=url, **kwargs)
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 324, in request
     prep = req.prepare()
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 223, in prepare
     p.prepare_headers(self.headers)
   File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/models.py", line 340, in prepare_headers
     headers = dict((name.encode('ascii'), value) for name, value in headers.items())
AttributeError: 'str' object has no attribute 'items'

如果我使用 HEADER2,它会干净利落地执行:

将规则集移回应用程序结果:响应 [200]

谁能解释一下有什么区别?

【问题讨论】:

是什么让您认为 JSON 编码的字符串可以作为 HTTP 请求的标头字典接受? 【参考方案1】:

你传入了一个字符串headers 不能永远是 JSON 编码的字符串,它始终是 Python 字典。

print 结果具有欺骗性; JSON 编码的对象看起来很像 Python 字典表示,但它们与同一事物

requests API 明确指出headers 必须是字典:

headers - (可选)要使用 Request 发送的 HTTP 标头字典。

JSON 数据是您作为内容发送到另一台服务器的内容,而不是您用来与 Python API 通信的内容。

【讨论】:

我明白了 - 我检查了 type() 并看到了差异: Headers1 是 "Destination": "/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets" Headers1 是类型: Headers2 is 'Destination': '/api/af/latest/applications/cc9226315643df89-36bf02429075329d0ba36748360d050c/rulesets' Headers2 的类型为:【参考方案2】:

你可以通过

  'Content-Type': 'application/json;charset=UTF-8'

成功了

【讨论】:

【参考方案3】:

我遇到了这个问题,我需要使用内容类型制作标题并将数据元素作为 json 传递。

import requests
import json

headerInfo = 'content-type': 'application/json' 
payload = 'text': 'okay!!!', 'auth_token': 'aasdasdasdasd'
jLoad = json.dumps(payload)

r = requests.post('http://example.com:3030/widgets/init', headers=headerInfo, data=jLoad)
print r.text
print r.status_code

【讨论】:

非常感谢您的回答。

以上是关于AttributeError:“str”对象没有属性“items”的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy“AttributeError:'str'对象没有属性'c'”

AttributeError 'str' 对象没有属性 'path'

Django 2.2 + AttributeError:'str'对象没有属性'decode'

为啥我得到 AttributeError:'str' 对象没有属性 'strftime'?

AttributeError:'str'对象在构建逻辑回归模型时没有属性'decode'[重复]

Django-channels:AttributeError:'str'对象没有属性'profile'