Skip to content

Setting Up Backends

pookieStorage does not configure storage backends. You configure your storage classes exactly as you always have. pookieStorage reads the class name from POOKIE_STORAGE and uses it.

Cloudflare R2

# core/storage.py
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from storages.backends.s3boto3 import S3Boto3Storage
import os


class LocalStorage(FileSystemStorage):
    def __init__(self, *args, **kwargs):
        super().__init__(
            location=os.path.join(settings.BASE_DIR, "media"),
            *args,
            **kwargs,
        )


class R2MediaStorage(S3Boto3Storage):
    location = "media"
    file_overwrite = False
    querystring_auth = True
    default_acl = None
    signature_version = "s3v4"
    expiration = 3600

    def __init__(self, *args, **kwargs):
        self.bucket_name = os.environ.get("CLOUDFLARE_R2_MEDIA_BUCKET_NAME")
        self.custom_domain = None
        super().__init__(*args, **kwargs)
# settings.py
import os

AWS_ACCESS_KEY_ID = os.environ.get("CLOUDFLARE_R2_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.environ.get("CLOUDFLARE_R2_SECRET_ACCESS_KEY")
AWS_S3_ENDPOINT_URL = os.environ.get("CLOUDFLARE_R2_ENDPOINT")
AWS_S3_REGION_NAME = "auto"
AWS_S3_FILE_OVERWRITE = False

POOKIE_STORAGE = {
    "local": "core.storage.LocalStorage",
    "cloud": "core.storage.R2MediaStorage",
}

POOKIE_STORAGE_BACKEND = "cloud"

AWS S3

# core/storage.py
from storages.backends.s3boto3 import S3Boto3Storage


class S3MediaStorage(S3Boto3Storage):
    location = "media"
    file_overwrite = False
    querystring_auth = True
# settings.py
import os

AWS_ACCESS_KEY_ID = os.environ.get("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.environ.get("AWS_SECRET_ACCESS_KEY")
AWS_S3_REGION_NAME = os.environ.get("AWS_S3_REGION_NAME")
AWS_STORAGE_BUCKET_NAME = os.environ.get("AWS_STORAGE_BUCKET_NAME")

POOKIE_STORAGE = {
    "local": "core.storage.LocalStorage",
    "cloud": "core.storage.S3MediaStorage",
}

POOKIE_STORAGE_BACKEND = "cloud"

Projects without django-storages

pookieStorage has no dependency on django-storages. If your backend is Django's built-in FileSystemStorage, everything works. django-storages is only needed when your own storage classes use it.

Any Django-compatible storage

Any class that implements Django's storage interface works as a pookieStorage backend. Pass its dotted path as a value in POOKIE_STORAGE and pookieStorage will import and instantiate it at startup.