Come gestire file statici (Es. immagini, JavaScript, CSS)¶
I siti web generalmente necessitano di servire file aggiuntivi come immagini, JavaScript o CSS. In Django, vi facciamo riferimento come «file statici». Django offre django.contrib.staticfiles
per aiutarti a gestirli.
Questa pagina descrive come puoi distribuire questi file statici.
Configurazione file statici¶
Assicurati che
django.contrib.staticfiles
sia inserito inINSTALLED_APPS
.Nel tuo file dei settings, definisci
STATIC_URL
, per esempio:STATIC_URL = "static/"
In your templates, use the
static
template tag to build the URL for the given relative path using the configuredstaticfiles
STORAGES
alias.{% load static %} <img src="{% static 'my_app/example.jpg' %}" alt="My image">
Archivia i tuoi file statici in una cartella chiamata
static
nella tua app. Per esempiomy_app/static/my_app/example.jpg
.
Servire i file
In aggiunta a questi passaggi di configurazione, hai anche bisogno effettivamente di distribuire file statici.
Durante lo sviluppo, se usi django.contrib.staticfiles
, sarà fatto automaticamente da runserver
quando DEBUG
è True
(vedi django.contrib.staticfiles.views.serve()
).
Questo metodo è altamente inefficiente e probabilmente poco sicuro, per questo è inadeguato alla produzione.
Consulta la documentazione Come distribuire file statici per le migliori strategie per distribuire file statici in ambienti di produzione.
Il tuo progetto avrà probabilmente anche asset statici che non sono legati ad una app particolare. Oltre ad usare una directory static/
nelle tue applicazioni, puoi definire una lista di directory (STATICFILES_DIRS
) nel tuo file di impostazioni dove Django cercherà ulteriormente i file statici. Per esempio:
STATICFILES_DIRS = [
BASE_DIR / "static",
"/var/www/static/",
]
Consulta la documentazione per la configurazione relativa a STATICFILES_FINDERS
per i dettagli su come staticfiles
trova i tuoi files.
Namespacing dei file statici
Come per i template, potremmo semplicemente inserire i nostri file statici direttamente in my_app/static/
(anziché creare un’altra sottodirectory my_app
), ma sarebbe certamente una cattiva idea. Django sceglierà il primo file statico che troverà con un nome che corrisponde, e se tu avessi un file statico con lo stesso nome in una app diversa, Django non saprebbe come distinguere fra i due. Dobbiamo essere in grado di puntare Django sul file corretto, ed il modo migliore per farlo è quello di inserirlo in un namespace. Cioè, inserendo questi file statici dentro un’altra directory che abbia come nome il nome della app stessa.
Puoi assegnare namespace agli asset statici in STATICFILES_DIRS
specificando prefissi.
Servire file statici durante lo sviluppo¶
Se usi django.contrib.staticfiles
come spiegato sopra, runserver
lo farà automaticamente se DEBUG
è impostato su True
. Se non hai django.contrib.staticfiles
in INSTALLED_APPS
, puoi comunque servire manualmente i file statici usando la vista django.views.static.serve()
.
Questo non è adatto per un utilizzo in produzione! Per alcune strategie di pubblicazione comuni, guarda Come distribuire file statici.
Per esempio, se la tua impostazione STATIC_URL
è definita come static/
, puoi fare questo aggiungendo il seguente snippet a urls.py
:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
Nota
Questa funzione helper funziona solo in modalità debug e solo se il prefisso dato è locale (ad esempio static/
) e non un URL (es: http://static.example.com/
).
Anche questa funzione helper serve solo la cartella STATIC_ROOT
; non esegue la disocvery dei file statici come django.contrib.staticfiles
.
Infine, i file statici sono serviti via wrapper al livello di applicazione WSGI. Di conseguenza, le richieste a file static non passano attraverso la normale catena di middleware.
Distribuire file caricati da un utente durante lo sviluppo¶
Durante lo sviluppo, è possibile servire file multimediali caricati dall’utente da:setting:MEDIA_ROOT utilizzando la vista django.views.static.serve()
.
Questo non è adatto per un utilizzo in produzione! Per alcune strategie di pubblicazione comuni, guarda Come distribuire file statici.
Ad esempio, se il tuo MEDIA_URL
è definita come media/
, puoi farlo aggiungendo il seguente snippet al tuo:setting:ROOT_URLCONF:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Nota
Questa funzione di supporto è disponibile solo in modalità debug e solo se il prefisso è locale (es. media/
) ma non unaURL (es. http://media.example.com/
).
Testing¶
Quando si eseguono test che utilizzano richieste HTTP effettive invece del client di test integrato (per esempio utilizzando LiveServerTestCase
) gli asset statici devono essere serviti insieme al resto del contenuto in modo che l’ambiente di test riproduca quello reale il più fedelmente possibile, ma LiveServerTestCase
ha solo funzionalità di servizio di file statici molto basilari: non conosce la funzione di ricerca dell’applicazione staticfiles
e presuppone il il contenuto statico sia già stato collezionato in STATIC_ROOT
.
A causa di ciò, staticfiles
offre la propria django.contrib.staticfiles.testing.StaticLiveServerTestCase
, una sottoclasse di quella built-in che ha l’abilità di servire trasparentemente tutti gli asset durante l’esecuzione di questi test in modo molto simile a quello che si ottiene durante lo sviluppo con DEBUG = True
, cioè senza doverli collezionare usando prima collectstatic
.
Deployment¶
django.contrib.staticfiles
fornisce un comando di gestione comodo per la raccolta di file statici in un’unica directory in modo da poterli servire facilmente.
Imposta il valore di
STATIC_ROOT
alla directory da cui desideri servire questi file, ad esempio:STATIC_ROOT = "/var/www/example.com/static/"
Run the
collectstatic
management command:$ python manage.py collectstatic
Questo copia tutti i file dalla tua cartella static nella cartella definita in
STATIC_ROOT
.Utilizza un web server a tua scelta per distribuire i files. Come distribuire file statici copre alcune delle strategie di distribuzione comuni per i file statici.
Per saperne di più¶
Questo documento ha coperto le basi ed alcuni pattern di utilizzo comuni. Per avere dettagli completi su tutte le impostazioni, i comandi, i tag di template ed altri frammenti inclusi in django.contrib.staticfiles
, visita la guida di riferimento di staticfiles.