Python Django:通过POST请求上传文件

Python Django:通过POST请求上传文件,python,django,file,post,uploading,Python,Django,File,Post,Uploading,我试图通过APIView上传文件,但我遇到了一个异常:{“exception”:“ValidationException”,“code”:401,“message”:“在读取请求的数据流后无法访问正文”} 这是我的密码: API视图: class SetAvatarView(LoginRequiredAPIView): @csrf_exempt # Does no affect to situation def post(self, request): try:

我试图通过APIView上传文件,但我遇到了一个异常:
{“exception”:“ValidationException”,“code”:401,“message”:“在读取请求的数据流后无法访问正文”}
这是我的密码:

API视图:

class SetAvatarView(LoginRequiredAPIView):
    @csrf_exempt  # Does no affect to situation
    def post(self, request):
        try:
            request.account.update_avatar(request.FILES['file'])
        except ValidationException, e:
            return JsonResponse(e.to_dict(), status=400)
        return JsonResponse({}, 200)
账户
型号:

class Account(models.Model):
    ...
    avatar = models.ImageField(upload_to=AVATARS_URL, default='default.jpg')
    ...
    def update_avatar(self, f):
        self.avatar = f
上传文件的测试代码:

def test_set_avatar(self):
    url = "/account/avatar/set/"
    with open("test.jpg", "r") as fp:
        response = self.client.post(url, {'file': fp}, #content_type='multipart/form-data', # Getting 400 Bad Request if uncomment
                                    **{'HTTP_AUTHORIZATION': 'Token 0ff0884090**********8ef5387423bc24cd15e1'})
    print response.content
    self.assertEqual(response.status_code, 200)

settings.py中没有额外的中间件,我尝试禁用默认中间件,但没有结果。

您必须在view/account/avatar/set中对文件进行编码和解码

import base64 
def test_set_avatar(self):
    url = "/account/avatar/set/"
    with open("test.jpg", "r") as fp:
    response = self.client.post(url, {'file': base64.b64encode(fp.read())}, #content_type='multipart/form-data', # Getting 400 Bad Request if uncomment
                                **{'HTTP_AUTHORIZATION': 'Token 0ff0884090**********8ef5387423bc24cd15e1'})
    print response.content
    self.assertEqual(response.status_code, 200)

我想您需要
fp.read()
如果像
{'file':fp.read()}
这样发送文件,我会收到
{“错误”:“HTTP状态415-不支持的媒体类型”}
,如果这样发送并添加内容类型:image/jpeg,那么错误是
需要属性名称:第1行第2列(字符1)
尝试在此处添加
format='multipart'
内容类型和fp.read()的
format='multipart
,但实际上它并不能解决原始问题。是的,您可以以base64编码字符串的形式发送文件,但若您要在HTML表单或公共API中使用此端点,并且只想接收文件,该怎么办?