geekdoc-python-zh/docs/overiq/189.md

3.2 KiB
Raw Permalink Blame History

在 Django 中处理媒体文件

原文:https://overiq.com/django-1-11/handling-media-files-in-django/

最后更新于 2020 年 7 月 27 日


在 Django用户上传的文件被称为媒体文件。以下是媒体文件的一些示例:

  • 一个用户上传了图片pdfppt 等。
  • 电子商务网站上的产品图片。
  • 个人资料图像。等等

就像静态文件一样,为了提供媒体文件,我们必须在settings.py文件中添加一些配置。

媒体文件配置

媒体文件取决于两种配置:

  1. MEDIA_ROOT
  2. MEDIA_URL

这些变量都不是默认设置的。

媒体根设置

它包含将上传媒体文件的文件系统的绝对路径。它接受字符串,而不是列表或元组。

在 Django 项目根目录(djangobin/django_project)内新建一个名为media的目录,与manage.py所在的位置相同。

django_project/
├── db.sqlite3
├── djangobin
├── django_project
├── manage.py
├── media           <------------
├── staticfiles
└── templates

5 directories, 2 files

打开settings.py文件,在文件末尾添加以下代码,就在我们之前设置的STATIC_ROOT设置下面。

djangobin/django _ project/django _ project/settings . py

#...
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfies')

MEDIA_ROOT  = os.path.join(BASE_DIR, 'media')

媒体 _ 网址设置

该设置的工作原理类似于STATIC_URL,用于访问媒体文件。就在MEDIA_ROOT变量下面,定义MEDIA_ROOT变量如下:

djangobin/django _ project/django _ project/settings . py

#...
MEDIA_ROOT  = os.path.join(BASE_DIR, 'media')

MEDIA_URL = '/media/'

下载这个的图片,保存为media目录下的python.png。要访问文件,请访问http://127.0.0.1:8000/media/python.png。您将得到一个 HTTP 404 错误,如下所示:

但是为什么呢?

问题是 Django 开发服务器默认不提供媒体文件。为了让 Django 开发服务器提供静态服务,我们必须在 sitewide urls.py文件中添加一个 URL 模式。

在 Django 项目配置目录(djangobin/django_project/django_project)中打开urls.py,更新如下:

djangobin/django _ project/django _ project/URLs . py

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^', include('djangobin.urls', namespace='djangobin')),
    url(r'^admin/', admin.site.urls),
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

现在再次访问http://127.0.0.1:8000/media/python.png,这次你应该可以看到图像了。

就像静态文件一样,在生产中,您应该始终使用真实的 web 服务器来提供媒体文件。不幸的是,我们的项目不依赖于媒体文件。然而,随着目录结构的布局,实现需要媒体文件的功能并不需要太多时间。作为一个挑战,在完成这个系列之后,尝试自己实现这样的特性。