Project Oxygen & Ideo-LabIDEO LAB Dashboard 2026

Django Storages

Stockage de fichiers dans le Cloud (AWS S3, Google Cloud, Azure).
Guide d'implémentation pour la production.

Introduction & Concepts

Pourquoi ne peut-on pas stocker les fichiers localement en production ? Comprendre le systĂšme de stockage de Django.

Théorie Stateless
01

Installation de base

Installer le package principal et les librairies spécifiques (boto3, google-cloud, azure...).

Pip Settings
02

Amazon S3

Le standard de l'industrie. Configuration complÚte avec boto3, Buckets, IAM et régions.

AWS Populaire
03

S3 Compatible / MinIO

Utiliser l'API S3 avec d'autres fournisseurs : DigitalOcean Spaces, Scaleway Object Storage, MinIO.

Self-Hosted Alternative
04

Google Cloud Storage

Configuration pour GCP. Gestion des clés JSON de compte de service et des buckets.

GCP KeyFile
05

Azure Storage

Stocker vos blobs sur Azure. Connection strings, Account Keys et conteneurs.

Microsoft Blob
06

Static vs Media

Configuration avancée : séparer les fichiers statiques (assets) des fichiers médias (uploads utilisateurs) dans des buckets/dossiers différents.

Architecture Crucial
07

Dropbox & SFTP

Backends alternatifs : Utiliser Dropbox comme CDN ou un vieux serveur SFTP pour le stockage.

Legacy API
08

Bonnes Pratiques

URLs signées (liens privés), Cache-Control pour les performances, ACLs publics vs privés.

Security Perf
09
1. Pourquoi Django Storages ?

Le problĂšme du stockage local

En développement (DEBUG=True), Django stocke les fichiers uploadés dans un dossier local (ex: media/). C'est simple et ça marche.

Mais en production (Docker, Heroku, Kubernetes) :

  • Le systĂšme de fichiers est souvent Ă©phĂ©mĂšre (dĂ©truit au redĂ©marrage).
  • Si vous avez plusieurs serveurs, un fichier uploadĂ© sur le Serveur A n'est pas visible sur le Serveur B.
  • Servir des gros fichiers via Django/Gunicorn tue les performances.

L'API Storage de Django

Django possÚde une API d'abstraction pour le stockage. django-storages implémente cette API pour connecter Django aux services Cloud (S3, Azure, etc.) sans changer votre code métier.

PYTHON
# Dans vos modÚles, rien ne change ! class Photo(models.Model): # Django utilise le backend configuré globalement image = models.ImageField(upload_to='photos/')
2. Installation

Installation des paquets

Installez django-storages ET la librairie spécifique à votre fournisseur cloud.

Base + AWS S3

pip install django-storages boto3

Base + Google Cloud

pip install django-storages google-cloud-storage

Base + Azure

pip install django-storages azure-storage-blob

Déclaration de l'App

Ajoutez simplement storages dans vos applications installées.

settings.py
INSTALLED_APPS = [ # ... 'storages', ]
3. Configuration Amazon S3

Variables d'environnement

Ne stockez jamais ces clés en dur dans le code ! Utilisez os.environ ou python-dotenv.

settings.py
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY') AWS_STORAGE_BUCKET_NAME = os.getenv('AWS_STORAGE_BUCKET_NAME') AWS_S3_REGION_NAME = 'eu-west-3' # (ex: Paris) AWS_S3_SIGNATURE_VERSION = 's3v4'

Nouvelle Configuration (Django 4.2+)

Utilisez le dictionnaire STORAGES. C'est la méthode moderne.

settings.py
STORAGES = { "default": { "BACKEND": "storages.backends.s3boto3.S3Boto3Storage", "OPTIONS": { # On peut surcharger des options ici si besoin }, }, "staticfiles": { "BACKEND": "storages.backends.s3boto3.S3StaticStorage", }, }

Ancienne Configuration (Legacy)

Encore trÚs utilisée dans les tutoriels.

settings.py
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' STATICFILES_STORAGE = 'storages.backends.s3boto3.S3StaticStorage'
4. S3 Compatible (DigitalOcean, MinIO)

Changer le Endpoint

Les services comme DigitalOcean Spaces, Scaleway Object Storage ou MinIO utilisent le protocole S3. Il suffit de spécifier l'URL personnalisée.

settings.py
# Configuration standard S3 (boto3) AWS_ACCESS_KEY_ID = ... AWS_SECRET_ACCESS_KEY = ... AWS_STORAGE_BUCKET_NAME = 'mon-bucket' # LA différence clé : AWS_S3_ENDPOINT_URL = 'https://sgp1.digitaloceanspaces.com' # ou pour MinIO local : 'http://127.0.0.1:9000'

Le backend reste storages.backends.s3boto3.S3Boto3Storage.

5. Google Cloud Storage

Service Account (JSON)

GCP fonctionne généralement avec un fichier clé JSON.

  1. Créez un Service Account dans la console GCP.
  2. Téléchargez la clé JSON.
  3. Placez-la (hors du code !) ou définissez son chemin.

Configuration

settings.py
GS_BUCKET_NAME = 'mon-bucket-gcp' # Chemin vers le fichier JSON GS_CREDENTIALS = service_account.Credentials.from_service_account_file( os.path.join(BASE_DIR, 'gcp-key.json') ) STORAGES = { "default": { "BACKEND": "storages.backends.gcloud.GoogleCloudStorage", }, "staticfiles": { "BACKEND": "storages.backends.gcloud.GoogleCloudStorage", }, }
6. Azure Storage

Azure Blob Storage

settings.py
AZURE_ACCOUNT_NAME = "moncompte" AZURE_ACCOUNT_KEY = "la-cle-secrete..." AZURE_CONTAINER = "media" STORAGES = { "default": { "BACKEND": "storages.backends.azure_storage.AzureStorage", }, }
7. Séparer Static & Media (Avancé)

La distinction vitale

  • Static : CSS, JS, Images du thĂšme. DĂ©ployĂ©s par le dĂ©veloppeur (`collectstatic`). Doivent ĂȘtre publics et trĂšs cachĂ©s.
  • Media : Uploads des utilisateurs (Avatars, PDF). Peuvent ĂȘtre privĂ©s.

Si vous mettez tout dans le mĂȘme bucket Ă  la racine, ça devient vite le chaos.

Classes Custom

La bonne pratique est de créer deux classes héritant de S3Boto3Storage pour définir des sous-dossiers.

custom_storages.py
from storages.backends.s3boto3 import S3Boto3Storage class StaticStorage(S3Boto3Storage): location = 'static' default_acl = 'public-read' class MediaStorage(S3Boto3Storage): location = 'media' default_acl = 'private' # ou public-read selon besoin file_overwrite = False
settings.py
STORAGES = { "default": {"BACKEND": "my_project.custom_storages.MediaStorage"}, "staticfiles": {"BACKEND": "my_project.custom_storages.StaticStorage"}, }
8. Backends Alternatifs

SFTP Storage

Utile pour les architectures legacy ou le stockage sur NAS.

settings.py
SFTP_STORAGE_HOST = '192.168.1.50' SFTP_STORAGE_ROOT = '/var/www/uploads' SFTP_STORAGE_PARAMS = { 'username': 'deploy', 'password': 'password', }

Dropbox

Peut servir de stockage gratuit pour des petits projets.

settings.py
DROPBOX_OAUTH2_TOKEN = '...' DROPBOX_ROOT_PATH = '/'
9. Bonnes Pratiques & Tips

URLs Signées (Signed URLs)

Par défaut sur S3, si default_acl = 'private', Django génÚre des URLs temporaires signées pour accéder aux fichiers.

  • Avantage : SĂ©curitĂ©. Le lien expire aprĂšs X secondes.
  • Configuration : AWS_QUERYSTRING_AUTH = True (dĂ©faut).

Pour des fichiers publics (images de profil), mettez AWS_QUERYSTRING_AUTH = False et configurez le bucket en lecture publique.

Cache Control (Performance)

Pour les fichiers statiques (CSS/JS), il faut dire au navigateur de les garder en cache longtemps.

settings.py
AWS_S3_OBJECT_PARAMETERS = { 'CacheControl': 'max-age=86400', }