jamstooks / django-s3-folder-storage

Quick extension of django-storages' S3BotoStorage to allow separate media and static folders within a bucket.
BSD 3-Clause "New" or "Revised" License
149 stars 25 forks source link

django-s3-folder-storage

Build Status Code Climate

Quick extension of django-storages' S3BotoStorage to allow separate folders for uploaded and static media within an S3 bucket.

Overview

Many of my sites use the same configuration: static files are stored in //s3.amazonaws.com/<bucket_name>/static/ and uploaded files are stored somewhere under //s3.amazonaws.com/<bucket_name>/media/. Instead of extending S3BotoStorage in every project I decided to build a package. The names of those folders are configurable in settings.py.

Installation

Use pip to install from PyPI:

pip install django-s3-folder-storage

Add s3_folder_storage to your settings.py file:

INSTALLED_APPS = (
    ...
    's3_folder_storage',
    ...
)

Configuration

You are essentially using django-storages for S3 hosting, so you will be using their settings. The two settings that are specific to django-s3-folder-storage are DEFAULT_S3_PATH and STATIC_S3_PATH.

Here's an example:

# Creds
AWS_ACCESS_KEY_ID = {{ your key id here }}
AWS_SECRET_ACCESS_KEY = {{ your secret key here }}
AWS_STORAGE_BUCKET_NAME = {{ your bucket name here }}

# Uploaded Media Folder
DEFAULT_FILE_STORAGE = 's3_folder_storage.s3.DefaultStorage'
DEFAULT_S3_PATH = "media"
MEDIA_ROOT = '/%s/' % DEFAULT_S3_PATH
MEDIA_URL = '//s3.amazonaws.com/%s/media/' % AWS_STORAGE_BUCKET_NAME

# Static media folder
STATICFILES_STORAGE = 's3_folder_storage.s3.StaticStorage'
STATIC_S3_PATH = "static"
STATIC_ROOT = "/%s/" % STATIC_S3_PATH
STATIC_URL = '//s3.amazonaws.com/%s/static/' % AWS_STORAGE_BUCKET_NAME
ADMIN_MEDIA_PREFIX = STATIC_URL + 'admin/'

Troubleshooting

Depending on how you have your buckets configured and if you want to use SSL, you may need to use something like the following:

MEDIA_URL = 'https://%s.s3.amazonaws.com/media/' % AWS_STORAGE_BUCKET_NAME
STATIC_URL = 'https://%s.s3.amazonaws.com/static/' % AWS_STORAGE_BUCKET_NAME

As a first step, I recommend trying to get the collectstatic management command working within your project:

python manage.py collectstatic

You can also run the tests:

python manage.py test s3_folder_storage

to confirm that files are being written to S3

Contributing

Think this needs something else? To contribute to django-s3-folder-storage create a fork on github. Clone your fork, make some changes, and submit a pull request.

Bugs are great contributions too! Feel free to add an issue on github.