00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.