我在本地服务器上运行,当我在浏览器中转到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)
答案 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等程序递归下载文件。甚至那些本应是私有的文件。