【问题标题】:Force TemporaryFileUploadHandler on specific request根据特定请求强制使用 TemporaryFileUploadHandler
【发布时间】:2020-02-19 09:07:32
【问题描述】:

我需要使用 GeoDjango 处理上传的文件。根据文档,我应该使用 GDAL 的 Datasource() 构造函数。

问题是上传的 shapefile 的大小可能小于 2.5 MB,因此默认使用 MemoryFileUploadHandler,因此我无法访问 Datasource() 所需的文件路径。

我决定为我的特定视图覆盖request.upload_handlers,只使用"django.core.files.uploadhandler.TemporaryFileUploadHandler",因为我不需要创建子类(目前),但我收到以下错误:You cannot set the upload handlers after the upload has been processed.

这是我的一段代码:

def home(request):
    request.upload_handlers = ["django.core.files.uploadhandler.TemporaryFileUploadHandler"]

    if request.method == 'POST':
        form = UploadFileForm(request.POST, request.FILES)
        if form.is_valid():
            handle_uploaded_file(request.FILES['file'])
    else:
        form = UploadFileForm()
    return render(
        request,
        'app/index.html',
        {
            'title':'HOME',
            'form': form,
        }
    )

我做错了什么?另外,我是否应该为自定义处理程序创建一个子类?

【问题讨论】:

    标签: django


    【解决方案1】:

    问题是当函数被调用时,django 已经使用了 upload_handler,所以现在改变它已经太晚了。

    我记得如果您禁用 csrf 功能,您可能仍然可以更改它。 (另见:Where/how to replace default upload handler in Django CBV?

    另一种可能性是编写自己的上传处理程序,或者可能是根据路径更改上传处理程序的中间件。

    【讨论】:

    • 感谢指点!关于您编写​​自己的上传处理程序的建议,是否意味着我应该将其添加到默认处理程序列表中的settings.py 中?或者我应该在我的观点中指定它。如果是这样,csrf 模块仍然会抱怨我在调用它后尝试设置处理程序,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2011-08-20
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多