Gestione Media
I file media in Django sono tutti quei file caricati dagli utenti dellâapplicazione, come immagini del profilo, documenti e allegati. La gestione corretta di questi file eâ fondamentale sia in fase di sviluppo che in produzione.
Configurazione dei File Media
La configurazione di base richiede due impostazioni nel file settings.py:
# settings.py
import os
# Percorso assoluto alla directory dove salvare i file media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
# URL utilizzata per servire i file media
MEDIA_URL = '/media/'
MEDIA_ROOT indica la directory fisica sul server dove i file vengono salvati, mentre MEDIA_URL definisce il prefisso URL per accedere ai file via browser.
Servire File Media in Sviluppo
Durante lo sviluppo locale, Django puoâ servire direttamente i file media tramite il server di sviluppo. Questa configurazione va aggiunta solo quando DEBUG = True.
# urls.py (progetto principale)
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('miaapp.urls')),
]
# Servire file media SOLO in sviluppo
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Questa funzione static() aggiunge le URL necessarie per servire i file dalla directory MEDIA_ROOT. Non va mai usata in produzione.
File Media in Produzione
In produzione, Django non deve servire i file media direttamente. Questa responsabilitaâ va delegata al web server (come Nginx o Apache) oppure a un servizio di storage cloud.
Configurazione con Nginx
# Configurazione Nginx
# server {
# listen 80;
# server_name miosito.com;
#
# location /media/ {
# alias /percorso/progetto/media/;
# }
#
# location / {
# proxy_pass http://127.0.0.1:8000;
# }
# }
Configurazione con WhiteNoise
WhiteNoise eâ utile per i file statici ma non gestisce i file media. Per i media in produzione, eâ consigliato utilizzare storage cloud.
Storage Backend Personalizzati
Django 5.x utilizza il sistema STORAGES per configurare i backend di salvataggio. Puoi definire backend diversi per scopi diversi.
# settings.py
STORAGES = {
"default": {
"BACKEND": "django.core.files.storage.FileSystemStorage",
},
"staticfiles": {
"BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage",
},
}
Il backend default eâ quello usato per i file caricati dagli utenti. Puoi sostituirlo con un backend personalizzato o di terze parti.
Creare uno Storage Personalizzato
from django.core.files.storage import Storage
class MioStoragePersonalizzato(Storage):
def __init__(self, opzione=None):
self.opzione = opzione
def _open(self, name, mode='rb'):
# Logica per aprire un file
pass
def _save(self, name, content):
# Logica per salvare un file
# Restituisce il nome finale del file
return name
def exists(self, name):
# Controlla se il file esiste
return False
def url(self, name):
# Restituisce l'URL pubblica del file
return f'https://miocdn.com/media/{name}'
Integrazione con django-storages
Il pacchetto django-storages fornisce backend pronti allâuso per i servizi cloud piuâ diffusi come Amazon S3, Google Cloud Storage e Azure Blob Storage.
# Installazione
# pip install django-storages boto3
Configurazione per Amazon S3
# settings.py
STORAGES = {
"default": {
"BACKEND": "storages.backends.s3boto3.S3Boto3Storage",
},
"staticfiles": {
"BACKEND": "storages.backends.s3boto3.S3StaticStorage",
},
}
# Credenziali AWS
AWS_ACCESS_KEY_ID = 'la-tua-access-key'
AWS_SECRET_ACCESS_KEY = 'la-tua-secret-key'
AWS_STORAGE_BUCKET_NAME = 'nome-del-bucket'
AWS_S3_REGION_NAME = 'eu-south-1'
# Opzioni aggiuntive
AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com'
AWS_DEFAULT_ACL = None
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=86400',
}
Configurazione per Google Cloud Storage
# pip install django-storages google-cloud-storage
# settings.py
STORAGES = {
"default": {
"BACKEND": "storages.backends.gcloud.GoogleCloudStorage",
},
}
GS_BUCKET_NAME = 'nome-del-bucket'
GS_PROJECT_ID = 'id-progetto-gcp'
GS_DEFAULT_ACL = 'publicRead'
Buone Pratiche
Quando gestisci file media in produzione, tieni a mente queste raccomandazioni:
# 1. Non salvare mai credenziali nel codice sorgente
# Usa variabili d'ambiente
import os
AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
# 2. Configura limiti per le dimensioni dei file
DATA_UPLOAD_MAX_MEMORY_SIZE = 10 * 1024 * 1024 # 10 MB
# 3. Aggiungi la directory media al .gitignore
# media/
Conclusione
La gestione dei file media in Django richiede approcci diversi a seconda dellâambiente. In sviluppo, il server integrato eâ sufficiente, ma in produzione eâ essenziale affidarsi a web server dedicati o a servizi di storage cloud. Lâutilizzo di django-storages semplifica enormemente lâintegrazione con provider come Amazon S3 e Google Cloud, garantendo scalabilitaâ e affidabilitaâ nella distribuzione dei file.