Django MEDIA_URL 和 MEDIA_ROOT

2025-01-03 08:41:00
admin
原创
133
摘要:问题描述:我正在尝试通过 Django 管理员上传图像,然后在前端页面或仅通过 URL 查看该图像。请注意,这一切都在我的本地机器上。我的设置如下:MEDIA_ROOT = '/home/dan/mysite/media/' MEDIA_URL = '/media/' 我已将 upload_to 参数设置为...

问题描述:

我正在尝试通过 Django 管理员上传图像,然后在前端页面或仅通过 URL 查看该图像。

请注意,这一切都在我的本地机器上。

我的设置如下:

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

MEDIA_URL = '/media/'

我已将 upload_to 参数设置为“images”,并且文件已正确上传到目录:

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

但是,当我尝试访问以下 URL 处的图像时:

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

我收到 404 错误。

我是否需要为上传的媒体设置特定的 URLconf 模式?

任何建议都值得感激。

谢谢。


解决方案 1:

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}))

通过这种方式,你可以在(在本地计算机上运行时)从 Django 提供静态媒体DEBUG = True,但你可以在生产时让你的 Web 服务器配置提供静态媒体。DEBUG = False

解决方案 2:

请仔细阅读官方 Django DOC,您会找到最合适的答案。

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

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)

解决方案 3:

对于 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

解决方案 4:

这是我在 Django 2.0 中所做的。首先设置 MEDIA_ROOT 和 MEDIA_URLsetting.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'

然后通过添加来media context_processors 启用TEMPLATE_CONTEXT_PROCESSORS

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            #here add your context Processors
            'django.template.context_processors.media',
        ],
    },
},
]

您的 media context processor已启用,现在每个都RequestContext将包含一个变量MEDIA_URL

现在您可以在您的template_name.html

<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>

解决方案 5:

我是否需要为上传的媒体设置特定的 URLconf 模式?

是的。对于开发来说,这很简单,只需将其添加到 URLconf 中即可:

if settings.DEBUG:
    urlpatterns += patterns('django.views.static',
        (r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}),
    )

但是,对于生产来说,您需要使用 Apache、lighttpd、nginx 或您喜欢的 Web 服务器来提供媒体。

解决方案 6:

如果你使用的是 Python 3.0+,则按如下方式配置你的项目

环境

STATIC_DIR = BASE_DIR / 'static'
MEDIA_DIR = BASE_DIR / 'media'
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

主要网址

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

urlspatterns=[
........
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

解决方案 7:

(至少)对于Django 1.8:

如果你使用

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

如上所述,确保在 urlpatterns = [] 中没有指向默认视图的“catch all”url 模式。由于 .append 会将添加的方案放在列表末尾,因此当然只有在没有先前的 url 模式匹配时才会对其进行测试。您可以使用类似这样的方法避免这种情况,其中将“catch all”url 模式添加到最后,独立于 if 语句:

if settings.DEBUG:
    urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

urlpatterns.append(url(r'$', 'views.home', name='home')),

解决方案 8:

以下是我使用 Django 1.10.6 为django-publications应用程序提供 PDF 所必须进行的更改:

使用与您相同的媒体目录定义settings.py

MEDIA_ROOT = '/home/user/mysite/media/'

MEDIA_URL = '/media/'

正如@thisisashwanipandey 所说,在项目的主要内容中urls.py

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)

并对@r-allela 提供的答案进行了修改settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ... the rest of your context_processors goes here ...
                'django.template.context_processors.media',
            ],
         },
    },
]

解决方案 9:

设置完所有 URLconf 模式后,您可能面临的另一个问题是变量{{ MEDIA_URL }}无法在模板中工作。要解决此问题,请确保在settings.py中添加

django.core.context_processors.media

在你的TEMPLATE_CONTEXT_PROCESSORS

解决方案 10:

按照上面提到的 =>3.0 的步骤进行调试模式

urlpatterns = [
...
]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

还有让我困惑的部分,上面的静态 URL 只在我的主项目 urls.py 文件中有效。我第一次尝试将其添加到我的应用程序中,想知道为什么我看不到图像。

最后确保设置以下内容:

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

解决方案 11:

对于 Django 1.10 来说:

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

解决方案 12:

添加到 Micah Carrick 对 django 1.8 的回答:

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

解决方案 13:

这是我在 Python 3.6 中使用 Django 1.11 在 DEBUG = False 模式下实现图像渲染的方法

from django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
# other paths
]

解决方案 14:

在生产环境中,Django 不会自动加载媒体根目录,因此我们可以通过在 URL 模式后添加以下代码来解决该问题:

urlpatterns = [
       ''''
         your urls
       ''''
    ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL,
                              document_root=settings.MEDIA_ROOT)

如果您使用多个应用程序,并且在主应用程序网址中包含应用程序网址,则只需在主项目网址上添加此代码(配置)。

解决方案 15:

将以下代码添加到“settings.py”以访问(打开或显示)已上传的文件:

# "urls.py"

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

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

解决方案 16:

对于开发中的 Django 3.0+,在主 urls.py 中包含以下内容:

urlpatterns = [
   # rest of your url paths here..
]

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

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

解决方案 17:

添加此代码settings.py

urlpatterns = [ 

....

....


]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3878  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2714  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   49  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   49  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用