Update 2 January 2021: This was written in 2009 when virtual private servers were the rage, so I've updated it slightly to deal with our new cloud overlords.

Where should uploaded assets go?  

A habit I once had was to store the uploaded content (including images) in a database.  At the time the thinking was I want to manage:

  1. Application code
  2. Application data

Keeping all the data in a database made sense.  This meant if I had to move a web app I just push code somewhere else and copy the database.  Very simple.

Most frameworks, correctly assume you’ll upload files to some sort of file storage.  I never fully understood this until I thought about how I’d speed things up when the time comes to speed things up.  Django forces you to think that way.

File storage can be the file-system, but for building robust applications, this data belongs in an object store like Amazon's S3.  

Almost from the start Django encourages you to:

  1. Upload any binary content to the filesystem with pointers in a database
  2. Have a separate server, or even machine serve static content.

Furthermore in a cached environment or even an environment that utilizes a CDN, putting static content in one spot, including user-generated content, was a big win.

I ported an app from symfony to Django, and I had been serving images via the database.  Immediately when I switched to the filesystem I saw a huge benefit.  Not just a drop in database connections, but there was an overall “zippiness” in the site.