我试图通过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模式?
任何建议都很感激。
谢谢。
我是否需要为上传的媒体设置特定的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设置。Django将处理DEBUG,确保它只在调试模式下使用。
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时,你可以让你的web服务器配置提供静态媒体
(至少)对于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.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中所做的。在setting.py中将“First MEDIA_ROOT”设置为“MEDIA_URL”
MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'
然后通过添加在TEMPLATE_CONTEXT_PROCESSORS中启用媒体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',
],
},
},
]
您的媒体上下文处理器是启用的,现在每个RequestContext将包含一个变量MEDIA_URL。
现在你可以在template_name.html中访问它
<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>