【问题标题】:Serving files uploaded by a user during development in django在 django 开发期间提供用户上传的文件
【发布时间】:2015-10-23 18:23:54
【问题描述】:

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

在开发过程中提供用户上传的文件。¶

在开发过程中,您可以从 MEDIA_ROOT 使用django.contrib.staticfiles.views.serve() 视图。

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

例如,如果您的 MEDIA_URL 定义为 /media/,您可以这样做 通过将以下 sn-p 添加到您的 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(),但我不确定这是否不一样

【问题讨论】:

    标签: django static media


    【解决方案1】:

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

    首先,在任何地方调用views.serve() 仅在DEBUG = True 时有效,如果在DEBUG = False 时使用,将引发Http404,部署应用程序时应如此。但是,在开发中使用它的好处是,您不必运行 collectstatic/gather 您的静态文件:您可以从静态或媒体根目录中提取它们,而无需四处移动。

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

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

    现在,在生产方面,提供静态/媒体文件并不是 Django 的 WSGI 能为您做好的事情。 Django 是为提供应用程序内容而编写的,在提供静态/用户上传的内容时表现不佳。如果您预计即使是中等负载,使用单独的服务器(如 ApacheNginx)与 Web 服务器(如 uWSGI)结合使用会更具可持续性,并且可以处理更多。 This doc 详细说明如何设置/解释更多。

    【讨论】:

      【解决方案2】:

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

      一种流行的替代品是使用 Amazon 的 S3 存储桶。例如,假设您创建了一个新存储桶。你的 MEDIA_URL 看起来像:

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

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

      这能回答你的问题吗?

      【讨论】:

      • 我想是的,谢谢!我想我只需要经历一次这个过程
      猜你喜欢
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 2013-03-20
      • 2014-03-13
      • 2016-04-04
      • 2012-06-04
      相关资源
      最近更新 更多