Python 类型错误:'NoneType'对象不支持项分配



我尝试通过下面的Python脚本通过API服务从Yealink管理云服务获取数据。但我得到错误&;TypeError: 'NoneType'对象不支持项目分配&;。

如何解决这个问题?我使用Python 3.10来运行下面的脚本。

# -*- coding: utf-8 -*-
import hmac
import hashlib
import base64
import time
import uuid
import requests
from hashlib import md5
import json
from urllib3 import encode_multipart_formdata
requests.packages.urllib3.disable_warnings()
accesskeyId = "f8517322d648ffa7ff758ccd17"
accesskeySecret = "11e47ef340e698eec4d5ea3"
base_url = 'https://api-dm.yealink.com:8445/'

def doRequest(method, uri, query, body, isForm):
url = base_url + uri
if not isForm:
headers = buildHeaders(method, uri, query, body)
headers['Content-Type'] = "application/json;charset=UTF-8"
else:
headers = buildHeaders(method, uri, {}, {}) 
print(headers)

if method == 'GET' and len(query) > 0:
parameter =getQueries(query)
r = requests.get(url, headers = headers, params = parameter, verify=False)
print (r.text, r.status_code)

if method =='POST':
if not isForm:
jsonBody = json.dumps(body)
r = requests.post(url, headers = headers, data = jsonBody, verify=False)
print (r.text, r.status_code)
else:
encode_data = encode_multipart_formdata(body)
body = encode_data[0]
headers['Content-Type'] = encode_data[1]
r = requests.post(url, headers = headers, data = body, verify=False)
print (r.text, r.status_code)


def buildHeaders(method, uri, query, body):
headers ={}
if len(body) > 0:
headers['Content-MD5'] = str(base64.b64encode(md5(json.dumps(body).encode("utf-8")).digest()).decode("utf-8"))
headers['X-Ca-Key'] = str(accesskeyId)
headers['X-Ca-Nonce'] = str(''.join(str(uuid.uuid4()).split('-')))
headers['X-Ca-Timestamp'] = str(int(round(time.time() * 1000)))
headers['X-Ca-Signature'] = str(base64.b64encode(hmac.new(accesskeySecret.encode("utf-8"), sign(method, uri, query, body , headers).encode("utf-8"), digestmod=hashlib.sha256).digest()).decode('utf8'))
return headers

def getQueries(query):
formattedQueryString = ""
paramIndex = 0
for p in query:
formattedQueryString += str(p) +"="+ str(query[p])
paramIndex += 1
if paramIndex != len(query):
formattedQueryString += "&"
return formattedQueryString
def buildHeaderString(headers):
header_string = ""
for key,value in headers.items():
if len(value) == 0:
continue
if len(header_string) > 0:
header_string += "n"
header_string+=key
header_string+=":"
header_string+=value
return header_string
def sign(method, uri, query, body , header):
header_string = buildHeaderString(header)
stringToSign = method + "n"+ str(header_string) + "n" + uri
if len(query) > 0:
stringToSign += ("n" +getQueries(query))
return str(stringToSign)

# Get data
print("GET the Details:")
doRequest('GET','api/open/v1/manager/mvc/MVCInfo/get', {"id": "805061D10004477"},{},False)

运行脚本后,得到如下错误:

Traceback (most recent call last):
File "C:Users...PythonScriptstest.py", line 105, in <module>
doRequest('GET','api/open/v1/manager/mvc/MVCInfo/get', {"id": "803061D100004477"},{},False)
File "C:Users...PythonScriptstest.py", line 24, in doRequest
headers['Content-Type'] = "application/json;charset=UTF-8"
TypeError: 'NoneType' object does not support item assignment

一个成功响应的例子应该是这样的

这里的成功响应示例

检查您在任何时候都没有将'None'传递给doRequest()的body参数。

您正在尝试将值重新分配给一个对象,该对象为"None",这就是导致您的问题的原因。

最新更新