Django MEDIA_URL和MEDIA_ROOT


229

我正在尝试通过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模式吗?

任何建议表示赞赏。

谢谢。

Answers:


293

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


14
PS。然后,您可以在模板中使用它:<img src =“ {{MEDIA_URL}} images / myimage.png” />
Micah Carrick

我认为^在之前添加符号不是很好media//(?P<path>.*)$,有时当我们在应用程序URL路径(如http://127.0.0.1:8000/myapp/media/img/logo.png)中访问媒体文件时,此常规将无法进行数学运算。
杰克张

我已经苦苦挣扎了两天,为什么我的图像返回404。这是我唯一缺少的东西,我在Django文档中找不到它。谢谢。
tambalolo

1
如果您使用的是Django 1.5+,请参见以下答案;这是一个更好的解决方案。
塔娜·布里姆霍尔

这在您的应用程序或项目urls.py中吗?
user7804781

105

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

1
这是django 1.5中新增的功能
codeVerine 2013年

可以在Apache的生产中使用这种方式吗?
andilabs

1
@andi-不可以在生产环境中使用这种方式。应该在您的产品上通过apache进行配置。
Vikas Gulati 2014年


1
但是可以不用if settings.DEV检查就将此代码留在生产环境中,因为它会自动禁用吗?
jozxyqk 2015年

70

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


2
这是django> 1.9,thnks的解决方案。
unixeO 2016年

13
只需确保将其放入您的项目而不是您的应用程序的urls.py中,这就是我不小心所做的。
亚诺

3
也为我在1.10上工作。
Deleet '16

对我不起作用。也许settings.py中有任何必要的基础设置?
Fusion

25

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

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

然后启用media context_processorsTEMPLATE_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>

精彩的解释-这就是我的答案。关键是添加媒体上下文处理器
David Maness

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服务器来提供媒体。


3
这意味着如何配置服务器?
M Hornbacher

我得到一个未解决的对“模式”的引用,是从某个地方导入的吗?
user7804781

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模式匹配时,才对它进行测试。您可以使用类似这样的方法来避免这种情况,即在最后添加“全部捕获” 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

这是我为django-publications提供PDF所做的更改使用Django 1.10.6应用:

在中使用与您相同的媒体目录定义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',
            ],
         },
    },
]

4

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

django.core.context_processors.media

在你的TEMPLATE_CONTEXT_PROCESSORS


2

为django 1.8添加Micah Carrick答案:

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

1
对我不起作用(1.10)。TypeError: view must be a callable or a list/tuple in the case of include().
Deleet '16

2

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

2

按照上面提到的步骤=> 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/'

1

如果是Django 1.10:

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

0

您的设置没问题。某些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    

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.