Django图片上传失败求助:POST上传图片至数据库失败
Django图片上传失败问题排查与修复
我尝试用Django通过POST请求将图片上传至数据库并在站点展示,但图片无法上传,运行时网页出现如下错误:
以下是我的相关代码文件:
models.py
from django.db import models class image_classification(models.Model): pic=models.ImageField(upload_to='images')
views.py
from django.shortcuts import render from .models import image_classification from django.http import HttpResponse, HttpResponseRedirect def home(request): print('here you go ') images=image_classification.objects.all() if len(images) > 0: url=images[len(images)-1].pic.url else: url="place holder image url" return render(request,'home.html',{'print':'everything is ok','image':url}) # 处理图片上传 def uploadImage(request): print('image handling ') img= request.FILES['image'] image=image_classification(pic=img) image.save() return HttpResponseRedirect('/')
应用urls.py
from django.urls import path from . import views from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('',views.home,name='home') ] urlpatterns+= static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns+= static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
项目urls.py
from django.contrib import admin from django.urls import path, include from ImageClassifier import views from django.conf.urls.static import static from django.conf import settings urlpatterns = [ path("admin/", admin.site.urls), path('', include('ImageClassifier.urls')), ]
settings.py
MEDIA_ROOT= os.path.join(BASE_DIR,'ImageClassifier/media/') MEDIA_URL= '/media/' STATIC_URL = "/static/" STATIC_ROOT= os.path.join(BASE_DIR, 'static')
问题分析与修复步骤
1. 缺失上传视图的URL映射
uploadImage视图未在URL配置中注册,导致POST请求找不到对应处理函数,这是核心问题之一。
修复:修改应用urls.py
添加上传视图的URL路径:
from django.urls import path from . import views from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('', views.home, name='home'), path('upload/', views.uploadImage, name='upload_image') # 新增该行 ] urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
2. 视图未处理非POST请求且无异常防护
uploadImage直接获取request.FILES['image'],若为GET请求或请求中无文件,会直接抛出错误。
修复:修改views.py中的uploadImage函数
def uploadImage(request): if request.method == 'POST': print('image handling ') img = request.FILES.get('image') # 使用get避免键不存在时抛出KeyError if img: image = image_classification(pic=img) image.save() return HttpResponseRedirect('/') # 非POST请求或无文件时,重定向回首页 return HttpResponseRedirect('/')
3. 上传表单未设置正确的enctype属性
上传文件的HTML表单必须添加enctype="multipart/form-data",否则Django无法解析文件上传请求。
修复:修改home.html中的表单
<form method="POST" action="{% url 'upload_image' %}" enctype="multipart/form-data"> {% csrf_token %} <!-- 必须添加CSRF令牌防止跨站请求伪造 --> <input type="file" name="image"> <button type="submit">上传图片</button> </form>
4. MEDIA_ROOT路径优化
MEDIA_ROOT末尾的斜杠可能导致路径解析问题,建议调整写法,并确保目录存在且有读写权限。
修复:修改settings.py
import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent MEDIA_ROOT = os.path.join(BASE_DIR, 'ImageClassifier', 'media') # 去掉末尾斜杠 MEDIA_URL = '/media/'
完成以上修改后,重启Django服务即可正常上传并展示图片。
内容的提问来源于stack exchange,提问作者Prasanjeet Panda
相关产品推荐
相关产品推荐

