首页 > 解决方案 > 如何使用 Django Rest Framework 为每个请求设置upload_handlers

问题描述

我有一个 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是通用视图集的操作)设置上传处理程序的正确方法是什么?

标签: djangodjango-rest-framework

解决方案


似乎您没有以正确的方式分配上传处理​​程序

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 类的视图中按原样工作


推荐阅读