Django的MEDIA_URL和MEDIA_ROOT

299 投票
17 回答
390130 浏览
提问于 2025-04-16 14:54

我正在尝试通过Django的管理后台上传一张图片,然后想在前端的某个页面上查看这张图片,或者直接通过一个网址来访问它。

请注意,这一切都是在我的本地电脑上进行的。

我的设置如下:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

我把上传的文件设置为放在'images'这个文件夹里,文件也确实成功上传到了这个目录:

'/home/dan/mysite/media/images/myimage.png'

但是,当我尝试通过以下网址访问这张图片时:

http://127.0.0.1:8000/media/images/myimage.png

我遇到了404错误。

我需要为上传的媒体文件设置特定的URL配置吗?

任何建议都非常感谢。

谢谢。

17 个回答

78

对于Django 1.9,你需要按照文档添加以下代码:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

想了解更多信息,可以参考这里:https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

118

请仔细阅读官方的Django文档,你会找到最合适的答案。

解决这个问题最简单的方法如下。

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
372

更新适用于 Django 版本 >= 1.7

根据 Django 2.1 的文档:在开发过程中提供用户上传的文件

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

你不再需要 if settings.DEBUG 这段代码,因为 Django 会自动确保这只在调试模式下使用。


原始答案适用于 Django 版本 <= 1.6

试着把这个放到你的 urls.py 文件里

from django.conf import settings

# ... your normal urlpatterns here

if settings.DEBUG:
    # static files (images, css, javascript, etc.)
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': settings.MEDIA_ROOT}))

这样你就可以在 DEBUG = True 的情况下(也就是在本地电脑上运行时)从 Django 提供静态媒体文件,但当你上线并且 DEBUG = False 时,可以让你的网页服务器配置来提供静态媒体文件。

撰写回答