python - 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
解决方案
只需尝试一次使用 MultiValueDict 的get()
方法从request
字典中获取数据。
uploaded_file = request.FILES.get('document', None)
推荐阅读
- java - 无法转换为类,因为它们位于加载程序“app”的未命名模块中
- c++ - 如何在 C++ 异常类析构函数中释放变量
- c - 这是什么定义声明?
- mysql - MySQL 在每个字段周围使用单引号加载数据
- php - 根据登录的用户将多个字段插入联结表?
- c# - 单实例和 IEnumerable 的重载方法
- c# - 使用 webdeploy 发布 ASP.NET Core 2.1 应用程序,不包括所有视图和应用程序文件夹
- delphi-10.2-tokyo - Delphi Tokyo 语言异常
- php - 为什么如果(条件)不适用于 '{""}''
- python - 如何使我的 Python 3 代码更紧凑?