首页 > 解决方案 > Django 休息框架 django.utils.datastructures.MultiValueDictKeyError: 'files'

问题描述

我正在尝试使用 api 上传图像,但显示此错误。谁能告诉我有什么问题。

Method Not Allowed: /scanner/batch-upload/
[09/Nov/2021 00:44:03] "GET /scanner/batch-upload/ HTTP/1.1" 405 8763
Internal Server Error: /scanner/batch-upload/
Traceback (most recent call last):
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/utils/datastructures.py", line 78, in __getitem__
    list_ = super().__getitem__(key)
KeyError: 'files'

在处理上述异常的过程中,又出现了一个异常:

Traceback (most recent call last):
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/rest_framework/generics.py", line 190, in post
    return self.create(request, *args, **kwargs)
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/accounts/views.py", line 336, in create
    file_path = request.FILES['files'].read()
  File "/home/kali/Desktop/py_speedy_scanner_img2pdf/venv/lib/python3.9/site-packages/django/utils/datastructures.py", line 80, in __getitem__
    raise MultiValueDictKeyError(key)
django.utils.datastructures.MultiValueDictKeyError: 'files'
[09/Nov/2021 00:44:07] "POST /scanner/batch-upload/ HTTP/1.1" 500 110792

标签: python-3.xrestfile-uploaddjango-rest-framework

解决方案


我认为这是因为在 request.Post 中找不到文件密钥。

Python 字典有一个集成的静态方法 .get() 。当 .get() 找不到键时,它会返回默认的 None 值或您指定的值。

我建议使用 .get() 。这是一个例子。

更改程序的设置

request.POST[""]

request.POST.get("", "default value")

另外,不需要在每个输入字段之前写{% csrf_token %}。对于每种形式,只需要一个 csrf_token。因此,您可以删除其他人,只需将一个存储在表单标签内。


推荐阅读