MultiValueDictKeyError:GET有效,POST无效。为什么?

时间:2019-07-19 17:02:35

标签: python django dictionary

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

我正在YouTube上关注Vitor Freitas辉煌的Django File Upload Tutorial

大约5分钟后,讲师开始添加POST请求方法。就我使用的某些名称和其他应用而言,我的项目略有不同。我正在本地开发环境中运行Django 2.2,无意将来部署此项目。

我已经仔细检查了每行几次。

当我将“ POST”换成“ GET”时,MultiValueDictKeyError错误消失并且网页运行无错误,但是我的Django Shell并没有按我期望的那样打印文件名和大小。

views.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')

我的upload.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 %}

urls.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   要求网址:http://127.0.0.1:8000/uploads/   Django版本:2.2   异常类型:MultiValueDictKeyError   异常值:“文档”   异常位置: getitem 中的/home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py, 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']   服务器时间:2019年7月19日星期五16:56:46 +0000

并且:

  

$ python3 manage.py运行服务器   使用StatReloader监视文件更改   正在执行系统检查...   系统检查未发现任何问题(0静音)。   七月19,2019-16:57:53   Django 2.2版,使用设置“ CC_Redact_Iter2.settings”   在http://127.0.0.1:8000/处启动开发服务器   用CONTROL-C退出服务器。   内部服务器错误:/ uploads /   追溯(最近一次通话):     文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py”,第78行,位于 getitem < / strong>       list_ = super()。获取项(键)   KeyError:“文档”   在处理上述异常期间,发生了另一个异常:   追溯(最近一次通话):     文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/core/handlers/exception.py”,第34行,位于内部       响应= get_response(请求)     文件“ /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,请求)     文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/core/handlers/base.py”,第113行,位于_get_response       响应= wraped_callback(请求,* callback_args,** callback_kwargs)     上传中的文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/uploads/views.py”,第9行       upload_file = request.FILES ['document']      getitem <中的文件“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/utils/datastructures.py”,第80行/ strong>       引发MultiValueDictKeyError(key)   django.utils.datastructures.MultiValueDictKeyError:'文档'   [19 / Jul / 2019 16:57:57]“ POST / uploads / HTTP / 1.1” 500 79510

1 个答案:

答案 0 :(得分:1)

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

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