Django的MEDIA_URL和MEDIA_ROOT

我试图通过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模式?

任何建议都很感激。

谢谢。

336148 次浏览

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

是的。对于开发,这就像添加到你的URLconf一样简单:

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

然而,对于生产,你会想要使用Apache、lighttpd、nginx或你喜欢的web服务器来服务媒体。

UPDATE for 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中提供静态媒体,但你可以让你的web服务器配置在你进入生产和DEBUG = False时提供静态媒体

请仔细阅读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)

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

django.core.context_processors.media

TEMPLATE_CONTEXT_PROCESSORS中。

加入Micah Carrick对django 1.8的回答:

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

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

(至少)对于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')),

如果是Django 1.10:

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

下面是我使用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)

settings.py中@r-allela提供的答案的修改:

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',
],
},
},
]

这里是我在Django 2.0中所做的。将First MEDIA_ROOT设置为setting.py中的MEDIA_URL

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

然后通过添加在TEMPLATE_CONTEXT_PROCESSORS中启用media 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>

你的设置没问题。一些web服务器需要特别指定媒体和静态文件夹文件。例如,在pythonanywhere.com中,你必须去“Web”部分,并添加媒体文件夹和静态文件夹的url。例如:

  URL                     Directory
/static/            /home/Saidmamad/discoverthepamirs/static
/accounts/static/   /home/Saidmamad/discoverthepamirs/accounts/static
/media/            /home/Saidmamad/discoverthepamirs/discoverthepamirs/media

我知道已经很晚了,但只是为了帮助那些因为同样的问题访问这个链接的人;)

这是我在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
]

对于调试模式,执行上述步骤=>3.0

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

也是抓住我的部分,上面的静态URL只在我的主项目URL .py文件中工作我第一次尝试添加到我的应用程序,并想知道为什么我不能看到图像。

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

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

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

设置

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

主要的url

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


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

对于开发中的Django 3.0+,在你的主url .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)
)

在生产环境中,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)

如果你正在使用多个应用程序,如果你在主应用程序url上包含应用程序url,只需在主项目url上添加此代码(配置)。

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

# "settings.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)

settings.py中添加此代码

urlpatterns = [


....


....




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