24

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

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

4

4 回答 4

24

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

如果您需要存储的图像多于应用程序服务器的硬盘空间,或者您需要多个应用程序服务器,或者您想使用 CDN 来减少延迟,或者......其他一千种事情中的一种,这可能会成为一个问题.

但是,除非您有特定的前期要求,否则要知道您需要担心的数千件事情中的哪一件(如果有的话)的唯一方法是启动您的网站,而最快的方法是将图像存储在media/.

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

于 2012-05-02T05:45:05.777 回答
9

默认情况下,Django 将所有文件(和图像)保存在 MEDIA_ROOT 中。但是,您可以编写自定义文件存储,以便将其保存在其他地方。

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

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

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

于 2012-05-02T06:23:56.013 回答
5

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

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

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

于 2012-05-02T14:43:09.747 回答
1

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

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

于 2012-05-02T07:54:54.080 回答