Django 配置 MEDIA_ROOT 与静态文件路由以正确显示上传图片
本文详解 Django 中如何正确配置 MEDIA_ROOT 和 MEDIA_URL,并通过 urlpatterns 添加 static 路由来允许服务器访问上传的媒体文件。针对常见的图片 404 错误,提供了从模型定义到模板引用的完整解决方案,确保上传头像等文件能在前端页面正常显示。
Django 图片上传模型配置
首先查看 models.py 中的模型定义,其中包含一个 upload_to 参数。为了与之前的配置彻底区分,作者将该参数赋值为 'avatar/'。该参数的作用是指定文件上传后的存储子目录,即文件将被保存在 MEDIA_ROOT 目录下的 avatar 文件夹中。
由于 upload_to 的值是拼接在 MEDIA_ROOT 路径之后的,因此只能使用相对路径形式,如 'avatar/' 或 './avatar/'。作者已验证过,若错误地写成绝对路径 '/avatar/',会导致文件保存位置异常。
此外,上述配置中提到了 MEDIA_ROOT,但此前项目中并未进行相关设置。
headImg = models.FileField(upload_to='avatar/')
配置 MEDIA_ROOT 媒体根目录
因此,必须在 settings.py 中显式设置 MEDIA_ROOT。具体做法是在项目根目录下新建一个名为 media 的文件夹,专门用于存放所有媒体文件。结合前述 upload_to 的设置,最终上传的文件将存储在 /media/avatar/ 路径下。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace("\\", "/")
上述 MEDIA_ROOT 变量定义了媒体根目录的路径。虽然这看似是基础概念,但关键在于:使用这些文件时,实际上是通过调用文件的 URL 来实现的。在 Django 框架中,任何 URL 请求都需要经过 urlpatterns 进行匹配和过滤。
因此,展示图片的逻辑流程如下:我们需要识别图片 URL 的规律。当请求符合特定规律时,Django 会根据文件名从媒体根目录中查找并返回相应的文件。
首先确定图片 URL 的规律。已知图片存储在 /media/avatar/ 目录下,这意味着图片路径必然包含 /media/avatar/。为了兼容未来可能存储的其他类型文件(例如缩略图存储在 /media/thumb/),我们取公共前缀 /media/ 作为 URL 过滤的匹配规律。
MEDIA_URL = '/media/'
这也解释了为什么 MEDIA_ROOT 和 MEDIA_URL 通常成对出现,且 MEDIA_URL 定义了 URL 前缀,而 MEDIA_ROOT 定义了本地文件系统路径,两者配合工作。
设置 urlpatterns 静态文件路由
完成上述配置后,需要在 urls.py 的 urlpatterns 中添加路由。此处的路由写法与普通视图路由不同,因为媒体文件属于静态资源范畴。普通路由通常指向执行特定逻辑的 views 函数,而此处则是指向一个目录,让 Django 直接查找并返回文件。写法为调用 static 函数,指定当 URL 符合该规律时,去指定目录查找文件。
需要在 urls.py 中导入必要的模块:
在 setting.py 中确保配置正确,并在 urls.py 中应用以下代码:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)```
解决图片 404 错误原因
如果在调试过程中经常观察浏览器输出的错误信息,通常会遇到 404 error 或 500 error。出现 404 error 的原因在于,之前提供的图片路径未在 urlpatterns 中定义对应的路由规则。当 Django 尝试展示图片时,发现该 URL 在路由表中没有匹配项,因此将其视为无效请求并返回 404 错误。在 urlpatterns 中正确添加上述静态文件路由后,Django 即可正确解析并返回图片,从而消除 404 错误。
模板中引用图片路径
最后一步,需要在 HTML 模板的 img 标签 src 属性中填写正确的图片地址。既然图片存储在 /media/avatar/ 目录下,图片的完整访问路径即为:
<img src="/media/{{user.headImg}}" alt=""/>
数据库中存储的图片路径是 upload_to 参数值与图片文件名的拼接结果。例如,若用户名为 test_mini,文件名后缀为 .jpg,则存储路径为 avatar/test_mini.jpg。
补充:解决 HTML 图片加载失败
补充知识:解决 Django 的 HTML 页面无法加载图片的问题
HTML 代码本身编写正确。
但在 Django 网页中却无法加载显示图片。

此处演示一种常见原因:由于 settings.py 中缺少相关配置,导致 Django 无法正确查找图片路径。

STATICFILES_DIRS=(
os.path.join(BASE_DIR,'static'),
)
补充以下代码以修复配置问题:

在 HTML 中插入图片相对简单,这里举例说明如何加载静态背景图。
{% load static %} <body background="{% static 'imges/bg.png' %}"></body>
运行项目查看效果。

结果显示正常,图片加载成功。
以上关于 Django 读取并显示图片的实例分享完毕,希望能为读者提供参考,欢迎大家继续支持本站获取更多技术内容。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













