Django MEDIA_URL和MEDIA_ROOT

时间:2011-04-01 19:31:03

标签: django media

我正在尝试通过Django管理员上传图片,然后在前端的页面中或通过网址查看该图片。

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

我的设置如下:

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

MEDIA_URL = '/media/'

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

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

但是,当我尝试访问以下网址的图片时:

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

我收到404错误。

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

任何建议表示赞赏。

感谢。

16 个答案:

答案 0 :(得分:252)

Django的更新> = 1.7

Per Django 2.1文档:Serving files uploaded by a user during development

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 < / p>

答案 1 :(得分:99)

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

答案 2 :(得分:67)

对于Django 1.9,您需要根据文档添加以下代码:

var obj = (function(){

    var obj = {
        name: "Tom",
        talk: function(){console.log( "my name is" + obj.name )}
    };

    return obj;
})();

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

答案 3 :(得分:23)

  

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

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

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

但是,对于制作,您需要使用Apache,lighttpd,nginx或首选的Web服务器来提供媒体服务。

答案 4 :(得分:14)

这是我在Django 2.0中所做的。在setting.py

中设置第一个MEDIA_ROOT MEDIA_URL
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 :(得分:6)

(至少)对于Django 1.8:

如果您使用

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

如上所述,确保在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')),

答案 6 :(得分:4)

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

  

django.core.context_processors.media

TEMPLATE_CONTEXT_PROCESSORS

答案 7 :(得分:4)

以下是使用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',
            ],
         },
    },
]

答案 8 :(得分:3)

按照上述=> 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/'

答案 9 :(得分:2)

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

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

答案 10 :(得分:1)

这对于Django 1.10:

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:1)

如果你使用的是 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)

答案 13 :(得分:0)

你的设置没问题。某些Web服务器需要专门指定媒体和静态文件夹文件。例如,在pythonanywhere.com中,您必须访问“Web&#39;部分并添加媒体文件夹和静态文件夹的URL。例如:

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

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

答案 14 :(得分:0)

对于正在开发的 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)
        )

答案 15 :(得分:0)

答案在这里 Images from media folder is not displaying django template

享受你的工作...