使用请求库将文件上载到Django PUT处理程序

时间:2015-08-05 10:55:13

标签: python django django-rest-framework python-requests

我有一个REST PUT请求,使用Django REST框架上传文件。每当我使用Postman REST客户端上传文件时,它都可以正常工作:

Postman configuration

但是当我尝试用我的代码执行此操作时:

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()

1 个答案:

答案 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