Django MEDIA_URL和MEDIA_ROOT

Dan*_*Dan 207 media django

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

请注意,这都在我的本地计算机上.

我的设置如下:

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

MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

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

'/home/dan/mysite/media/images/myimage.png'
Run Code Online (Sandbox Code Playgroud)

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

http://127.0.0.1:8000/media/images/myimage.png
Run Code Online (Sandbox Code Playgroud)

我收到404错误.

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

任何建议表示赞赏

谢谢.

Mic*_*ick 267

Django的更新> = 1.7

Per 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)
Run Code Online (Sandbox Code Playgroud)

您不再需要if settings.DEBUGDjango将处理,确保仅在调试模式下使用.


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}))
Run Code Online (Sandbox Code Playgroud)

有了这个,你可以在DEBUG = True(当你在本地计算机上运行时)从Django 提供静态媒体,但是当你去生产时你可以让你的web服务器配置服务于静态媒体.DEBUG = False

  • PS.然后,您可以在模板中使用它:<img rel="nofollow noreferrer" src ="{{MEDIA_URL}} images/myimage.png"/> (13认同)

JCh*_*___ 102

请仔细阅读官方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)
Run Code Online (Sandbox Code Playgroud)

  • 这是 django 1.5 中添加的新功能 (2认同)

thi*_*ani 69

对于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)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处:https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

  • 只要确保把它放到**项目的urls.py中**而不是你的应用程序,我不小心做了什么. (13认同)
  • 也在1.10为我工作. (3认同)
  • 这是django> 1.9的解决方案,thnks. (2认同)

mip*_*adi 23

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

是.对于开发,就像将其添加到您的URLconf一样简单:

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

但是,对于生产,您需要使用Apache,lighttpd,nginx或首选Web服务器来提供媒体服务.

  • 这意味着如何配置服务器? (3认同)

Akh*_*dra 18

这是我在Django 2.0中所做的.将MEDIA_ROL设置为第一个MEDIA_URLsetting.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

然后通过添加启用media context_processors inTEMPLATE_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',
        ],
    },
},
]
Run Code Online (Sandbox Code Playgroud)

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

现在你可以在你的访问中访问它 template_name.html

<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>
Run Code Online (Sandbox Code Playgroud)

  • 精彩的解释——这就是我的答案。关键是*添加媒体上下文处理器*。 (2认同)
  • 非常好的“context_processors”提示 (2认同)

小智 9

如果您使用 python 3.0+,则按如下方式配置您的项目

环境

STATIC_DIR = BASE_DIR / 'static'
MEDIA_DIR = BASE_DIR / 'media'
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

主要网址

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

urlspatterns=[
........
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)


小智 6

(至少)对于Django 1.8:

如果你使用

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

如上所述,确保在urlpatterns = []之前没有"引导所有"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')),
Run Code Online (Sandbox Code Playgroud)


Ale*_*son 6

这是我使用Django 1.10.6 为django-publications应用交付PDF时必须进行的更改:

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

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

MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)

由@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)
Run Code Online (Sandbox Code Playgroud)

以及@ 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',
            ],
         },
    },
]
Run Code Online (Sandbox Code Playgroud)


r_a*_*ela 5

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

django.core.context_processors.media

在您的TEMPLATE_CONTEXT_PROCESSORS.


Gav*_*vin 5

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

urlpatterns = [
...
]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Run Code Online (Sandbox Code Playgroud)

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

最后确保您设置了以下内容:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
Run Code Online (Sandbox Code Playgroud)