MEDIA_URL页面404错误Django

时间:2017-07-12 17:14:07

标签: django python-3.x

我在本地服务器上运行,当我在浏览器中转到http://127.0.0.1:8000/media/时,它说找不到页面。

设定:

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

根网址:

from django.conf.urls import url, include
from django.contrib import admin

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

urlpatterns = [
     url(r'^polls/', include('mysite.polls.urls')),
     url(r'^admin/', admin.site.urls),
     url(r'^submit/', include('mysite.uploads.urls')),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

用户上传模型:

from django.db import models
class Document(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField(upload_to='documents/')
    uploaded_at = models.DateTimeField(auto_now_add=True)

遵循Django文档:

提供用户在开发期间上传的文件

在开发过程中,您可以使用django.contrib.staticfiles.views.serve()视图从MEDIA_ROOT提供用户上传的媒体文件。

这不适合生产使用!有关常见的部署策略,请参阅部署静态文件。

例如,如果您的MEDIA_URL定义为/ media /,您可以通过将以下代码段添加到您的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)

https://docs.djangoproject.com/en/1.10/howto/static-files/

1 个答案:

答案 0 :(得分:0)

正如上面Alasdair的评论所指出的,这是Django的正常行为。如果您访问127.0.0.1/media/file.jpg之类的完整文件路径,Django将呈现该文件而不是引发404错误。

为什么会这样?

如果您查看为媒体/静态文件提供服务的视图的source,您就会找到这些行:

if os.path.isdir(fullpath):
    if show_indexes:
        return directory_index(newpath, fullpath)
    raise Http404(_("Directory indexes are not allowed here."))

它的作用是,它检查所请求的路径是否是目录。如果是,则检查变量show_indexes是否为True,然后它将返回media目录中文件的索引。由于show_indexes默认为False,因此会提高404.

要将show_indexes设置为True,您可以执行以下操作:

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT, show_indexes=True)

这不会引发404,并会在media目录中显示一个文件列表。

P.S。:我不认为显示文件索引是一个好主意,当然,除非你真正想要的东西。它使服务器处于额外负载以生成索引。有人可以使用像wget等程序递归下载文件。甚至那些本应是私有的文件。