Как установить upload_handlers для каждого запроса с помощью Django Rest Framework

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

У меня есть представление DRF, в котором мне нужно убедиться, что загруженные файлы попадают в файловую систему, а не только в память. DRF уважает настройки Django FILE_UPLOAD_HANDLERS , но я не хочу менять их для всего моего приложения, только для этого одного представления.

Я знаю, что в обычном представлении Django я мог бы установить request.upload_handlers желаемое значение, но, похоже, это не работает в DRF. Я пытался сделать это из .initialize_request() своего набора представлений, например:

 def initialize_request(self, request, *args, **kwargs):
    request.upload_handlers = ["django.core.files.uploadhandler.TemporaryFileUploadHandler"]
    return super().initialize_request(request, *args, **kwargs)
  

но я получаю:

 AttributeError: You cannot set the upload handlers after the upload has been processed.
  

Каков правильный способ для меня установить обработчики загрузки для одного представления DRF (в частности, create действие общего набора представлений)?

Ответ №1:

Похоже, вы неправильно назначаете обработчик загрузки

 from django.core.files.uploadhandler import TemporaryFileUploadHandler
from rest_framework import viewsets


class MyUploadViewSet(viewsets.ModelViewSet):
    # your view class attributes goes here....
    def initialize_request(self, request, *args, **kwargs):
        request.upload_handlers = [TemporaryFileUploadHandler(request)] # initialization goes here
        return super().initialize_request(request, *args, **kwargs)  

Примечание

Это будет работать как есть во всех представлениях на основе классов DRF