如何在Django中存储图像文件?

时间:2012-05-02 05:30:43

标签: django

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

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

4 个答案:

答案 0 :(得分:14)

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

如果您需要存储的图像多于您的应用服务器具有硬盘空间,或者您需要多个应用服务器,或者您希望使用CDN来减少延迟,或者...之一,这可能会成为一个问题其他千件事。

但是,除非你有特定的前期要求,否则了解你需要担心的那些事情中的哪一个(如果有的话)的唯一方法就是让你的网站启动,以及最快的方法即将图像存储在media/

的子目录中

如果您使用FileField执行此操作,并且您在代码中要小心,不要假设图像是本地磁盘上的文件(例如,您执行< / em>使用.url()的{​​{1}}方法,使用FileFile属性),将这些图像移动到当(以及如果)时间到来时,更合适的后端。

答案 1 :(得分:6)

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

选择什么?这取决于 您打算存储多少个文件?他们会使用多少存储空间?带宽多少?你认为会有很高的使用率吗?

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

无论如何,只有在获得一些数据后才能做出决定,如果有可能的真实数据。切换到不同的存储系统非常容易,因此我将从本地文件系统开始,然后在看到问题后切换到更高级的东西。

答案 2 :(得分:3)

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

如果你有一个简单的应用程序或网站,使用一个完全不同的服务器的静态文件可能是矫枉过正。它只适用于高并发(想想Twitter,Facebook等)的情况,其中应用程序无法让网络服务器担心任何事情,而是将请求传递给应用程序本身。现在,一些Web主机提供“云”存储以与您的VPS(例如Rackspace)一起使用。如果您正在使用这样的主机,请务必利用您所拥有的功能,但大多数情况下都没有必要。

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

答案 3 :(得分:1)

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

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