首页 > 解决方案 > MultiValueDictKeyError:GET 有效,POST 无效。为什么?

问题描述

我正在尝试处理用户在 Django 2.2 中上传的文件,看起来 GET 请求正在工作,但是 POST 正在抛出 MultiValueDictKeyError。

我在 YouTube 上关注 Vitor Freitas 的精彩Django 文件上传教程。

大约 5 分钟后,讲师开始添加 POST 请求方法。我的项目在我正在使用的一些名称和其他应用程序方面略有不同。我在本地开发环境中运行 Django 2.2,并且不打算在未来部署这个项目。

我仔细检查了每一行几次。

当我将“POST”换成“GET”时,MultiValueDictKeyError 错误消失了,网页运行时没有错误,但我的 Django shell 没有像我预期的那样打印文件名和大小。

视图.py:

from django.shortcuts import render
from django.views.generic import TemplateView

class Home(TemplateView):
    template_name = "home.html"

def upload(request):
    if request.method == 'POST':
        uploaded_file = request.FILES['document']
        print(uploaded_file.name)
        print(uploaded_file.size)
    return render(request, 'upload.html')

我的上传.html:

{% block content %}

    <h1> Eureka! </h1>

    <form method="POST" enctype="multipart/form-data">
        {% csrf_token %}
        <input type="file" name="document">
        <button type="submit">Upload file</button>
    </form>

{% endblock %}

网址.py:

from django.contrib import admin
from django.urls import path, re_path
# from . import views
from posts.views import *
from redactors.views import *
from counters.views import *
from AllAbove.views import *
from django.conf.urls.static import static
from django.conf import settings
from uploads.views import *

urlpatterns = [
   path('admin/', admin.site.urls),
   path('', home, name='home'),
   path('result/', result, name='result'),
   path('seth/', counters, name='seth'),
   path('uploads/', upload, name='upload'),
   #path('james/', post_details, name='james'),
   path('maggie/', maggie_post_details, name='maggie'),
   path('AllAbove/', all_above, name='AllAbove'),
   re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='james'),
   path('simon/', redactors, name='simon'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, 

我希望模板提示用户上传文件(如图像),然后在 Django shell 中显示文件名和大小。相反,我收到 MultiValueDictKeyError。该错误表明某处的“文档”名称存在问题。据我所知,模板和views.py中都正确引用了“文档”

这是完整的错误和回溯:

请求方法:POST 请求 URL: http: //127.0.0.1 :8000/uploads/ Django 版本:2.2 异常类型:MultiValueDictKeyError 异常值:'document' 异常位置:/home//dev/projects/python/2018-and- 2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py 在getitem中,第 80 行 Python 可执行文件:/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv /bin/python3 Python 版本:3.7.3 Python 路径:
['/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2', '/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python37.zip', ' /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7', '/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/ python3.7/lib-dynload','/usr/lib64/python3.7','/usr/lib/python3.7','/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/ venv/lib/python3.7/site-packages'] 服务器时间:Fri, 19 Jul 2019 16:56:46 +0000

和:

$ python3 manage.py runserver 使用 StatReloader 监视文件更改 执行系统检查... 系统检查未发现任何问题(0 静音)。2019 年 7 月 19 日 - 16:57:53 Django 版本 2.2,使用设置 'CC_Redact_Iter2.settings' 在http://127.0.0.1:8000/启动开发服务器 使用 CONTROL-C 退出服务器。内部服务器错误:/uploads/ Traceback(最近一次调用最后一次):文件“/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils /datastructures.py",第 78 行,在getitem list_ = super() 中。获取项目(key) KeyError: 'document' 在处理上述异常的过程中,又出现了一个异常: Traceback (最近一次调用 last): File "/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib /python3.7/site-packages/django/core/handlers/exception.py”,第 34 行,内部响应 = get_response(request) 文件“/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2 /venv/lib/python3.7/site-packages/django/core/handlers/base.py”,第 115 行,在 _get_response 响应 = self.process_exception_by_middleware(e, request) 文件“/home//dev/projects/python /2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/core/handlers/base.py”,第 113 行,在 _get_response 响应 = Wrapped_callback(request, *callback_args, **callback_kwargs)文件 ”/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/uploads/views.py”,第 9 行,在上传 upload_file = request.FILES['document'] 文件“/home//dev/projects/ python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py”,第 80 行,在getitem raise MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'document' [19/Jul/2019 16:57:57] "POST /uploads/ HTTP/1.1" 500 79510

标签: pythondjangodictionary

解决方案


只需尝试一次使用 MultiValueDict 的get()方法从request字典中获取数据。

uploaded_file = request.FILES.get('document', None)

推荐阅读