我有一个REST PUT请求,使用Django REST框架上传文件。每当我使用Postman REST客户端上传文件时,它都可以正常工作:
但是当我尝试用我的代码执行此操作时:
import requests
API_URL = "http://123.316.118.92:8888/api/"
API_TOKEN = "1682b28041de357d81ea81db6a228c823ad52967"
URL = API_URL + 'configuration/configlet/31'
#files = {
files = {'file': open('configlet.txt','rb')}
print URL
print "Update Url ==-------------------"
headers = {'Content-Type' : 'text/plain','Authorization':API_TOKEN}
resp = requests.put(URL,files=files,headers = headers)
print resp.text
print resp.status_code
我在服务器端收到错误:
MultiValueDictKeyError at /api/configuration/31/
"'file'"
我正在传递文件作为密钥,但仍然遇到上述错误,请告诉我这里可能出错的地方。
这是我的Django服务器视图的外观
def put(self, request,id,format=None):
configlet = self.get_object(id)
configlet.config_path.delete(save=False)
file_obj = request.FILES['file']
configlet.config_path = file_obj
file_content = file_obj.read()
params = parse_file(file_content)
configlet.parameters = json.dumps(params)
logger.debug("File content: "+str(file_content))
configlet.save()
答案 0 :(得分:0)
为此,您需要发送multipart/form-data
正文。您应该不在此处将整个请求的内容类型设置为text/plain
;只设置一部分的mime类型:
files = {'file': ('configlet.txt', open('configlet.txt','rb'), 'text/plain')}
headers = {'Authorization': API_TOKEN}
resp = requests.put(URL, files=files, headers=headers)
这会将整个请求的Content-Type
标题设置为库,并使用files
为您设置multipart/form-data
。