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

时间:2015-08-01 00:05:50

标签: django static media

这可能是一个愚蠢的问题,但在文档中说:

  

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

     

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

     

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

     

例如,如果您的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)

这是否意味着生产用+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)不应该使用或应该使用?

我理解这一点的方式是你不应该使用django.contrib.staticfiles.views.serve(),但我不确定这是不是一样

2 个答案:

答案 0 :(得分:3)

django.contrib.staticfiles.views.serve()不应用于部署。

首先,在任何地方调用views.serve()只会在DEBUG = True时有效,并且如果在Http404时使用,则会提高DEBUG = False,就像部署应用时一样。但是,在开发中使用它的好处是,您不必运行collectstatic /收集静态文件:您可以从静态或媒体根中提取它们,而无需移动任何东西。

它也有些不安全:views.serve()将使用mimetype模块猜测其服务文件的内容类型,该模块将依赖于您正在开发的平台的地图文件:由于特定环境中的mimetype模块,生产行为可能不同。

文档在django.contrib.staticfiles.views.serve()上有更多内容。

现在谈到制作,提供静态/媒体文件并不是Django的WSGI能为你做好的事情。 Django是为服务应用程序内容而编写的,在提供静态/用户上传内容方面效果不佳。如果您期望中等负载,使用单独的服务器(例如ApacheNginx)与uWSGI等网络服务器相结合,则更具可持续性,可以处理更多问题。 This doc详细介绍了如何设置/解释更多内容。

答案 1 :(得分:1)

在制作中,你应该有Debug = False。当你这样做时,Django不再提供静态文件。

一个受欢迎的替代品是使用亚马逊的S3 Buckets。例如,假设您创建了一个新存储桶。您的MEDIA_URL看起来像是:

MEDIA_URL = 'bucket.s3.amazonaws.com/media'

您将以相同的方式提供静态文件。

这会回答你的问题吗?