【问题标题】:How to store image files in Django?如何在 Django 中存储图像文件?
【发布时间】:2012-05-11 14:23:48
【问题描述】:

在 Django 中存储图像文件的典型场景是什么?更具体地说,图像是直接存储在本地文件系统或 Amazon S3 上的数据库 blob(例如 MongoDB GridFS)中吗?对于这三种情况,是否有可用的工具或 django 包来简化您存储图像的工作?

我目前正在将图像保存到本地开发服务器上 Django 项目中的 media 文件夹并从中提供服务。有人告诉我在同一台机器上提供静态文件是一种不好的做法。那么在 Django 中存储和提供静态图像的典型真实场景是什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    一个典型的真实示例是将上传的图像存储在您网站的media/ 目录的子目录中:)

    如果您需要存储的图像多于应用服务器的硬盘空间,或者您需要多个应用服务器,或者您想使用 CDN 来减少延迟,或者......其他一千种东西。

    但是,除非您有特定的前期要求,否则要知道您需要担心的数千件事中的哪些(如果有)的唯一方法是启动您的网站,并且是最快的方法也就是将图片存放在media/的子目录中。

    如果您使用FileField 执行此操作,并且您在代码中小心不要假设图像是本地磁盘上的文件(例如,您 使用FileFile.url() 方法,而您不要使用.path 属性),当(如果)时将这些图像移动到更合适的后端将是直截了当的时间到了。

    【讨论】:

      【解决方案2】:

      默认情况下,Django saves all of your files (and images) in the MEDIA_ROOT。但是,您可以写一个custom file storage,以便将其保存在其他地方。

      选择什么?这真的取决于。
      您打算存储多少文件?他们将使用多少存储空间?多少带宽?你认为会有非常高的使用高峰吗?

      通常,本地文件系统是最快的选择;但是,如果您发现这些图像会占用您过多的带宽,那么您可能需要卸载它们,尤其是在使用模式出现高峰时。相反,如果您需要横向扩展至多台服务器,那么您可能会发现将它们移动到数据库中是有益的。

      无论如何,您应该只在获得一些数据之后再决定,如果可能的话是真实数据。切换到不同的存储系统非常容易,所以我会从本地文件系统开始,然后在看到问题后才切换到更高级的系统。

      【讨论】:

        【解决方案3】:

        这实际上取决于您要解决的解决方案。在某些情况下,s3 可能是比本地文件存储更好的解决方案。 s3 在能够访问来自不同 Web 应用程序的数据以及与您正在使用的服务器分离方面提供了更大的灵活性。如果您打算使用大量图像,我认为 s3 是一条可行的路线。如果您认为要使用的图像数量有限,那么服务器上的本地存储将是一个很好的实现(我认为)。

        就您可以使用的工具而言,我会研究 PIL。 http://www.pythonware.com/products/pil/

        【讨论】:

        • PIL 似乎已经发展多年了。有一个分支叫Pillow
        【解决方案4】:

        这不是坏习惯,本身。我想谁告诉你这有点困惑。 Django 说你永远不应该使用 Django 提供静态资源,即它们应该由你用作 Django 反向代理的网络服务器(Apache、nginx 等)直接提供,但它没有关于是否必须在不同服务器或同一服务器上的争论。

        如果您有一个简单的应用程序或网站,使用一个完全不同的服务器来存储静态文件可能是矫枉过正。只有在高并发的情况下(想想 Twitter、Facebook 等),应用程序无法让网络服务器担心除了将请求发送到应用程序本身之外的任何事情。现在,一些网络主机提供“云”存储来配合您的 VPS(例如 Rackspace)。如果您正在使用这样的主机,请务必利用您所拥有的,但大多数情况下都没有必要。

        但是,在不同的子域下提供静态资源有的好处。您可以使用相同的服务器,但使用子域(例如 static.mysite.com)将允许浏览器进行更多并行下载,在某些情况下,至少可以防止来自主网站的 cookie 附加到每个静态请求。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-12
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          • 2021-04-04
          • 1970-01-01
          相关资源
          最近更新 更多