Django: загрузить файл через POST-запрос - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь загрузить файл через APIView, но получаю исключение: {"exception": "ValidationException", "code": 401, "message": "You cannot access body after reading from request's data stream"} Вот мой код:

API View:

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)

Account модель:

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 нет, и я попытался отключить промежуточные программы по умолчанию, безрезультатно.

1 Ответ

0 голосов
/ 05 июля 2018

Вы должны закодировать файл и декодировать в виде / аккаунт / аватар / установить

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