File Statici
I file statici in Django sono tutti quei file che non cambiano dinamicamente: fogli di stile CSS, script JavaScript, immagini, font e altri asset. Django fornisce un sistema completo per gestirli sia in sviluppo che in produzione.
Configurazione in settings.py
Le impostazioni principali per i file statici si trovano in settings.py:
# settings.py
import os
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
# URL pubblica per accedere ai file statici
STATIC_URL = '/static/'
# Directory aggiuntive dove Django cerca file statici
STATICFILES_DIRS = [
BASE_DIR / 'static',
]
# Directory dove collectstatic raccoglie tutti i file per la produzione
STATIC_ROOT = BASE_DIR / 'staticfiles'
- STATIC_URL: il prefisso URL usato per servire i file statici (es.
/static/css/stile.css). - STATICFILES_DIRS: lista di directory aggiuntive in cui Django cerca file statici durante lo sviluppo.
- STATIC_ROOT: la directory di destinazione dove
collectstaticcopia tutti i file per il deployment in produzione.
Struttura delle Cartelle
Puoi organizzare i file statici a livello di progetto o di singola app:
# A livello di progetto (in STATICFILES_DIRS)
# static/
# css/
# stile.css
# js/
# script.js
# img/
# logo.png
# A livello di app (con APP_DIRS attivo)
# myapp/
# static/
# myapp/
# css/
# stile.css
Per le app, si usa una sottocartella con il nome dellâapp per evitare conflitti di nomi tra app diverse.
Il Tag {% static %}
Per collegare i file statici nei template, usa il tag {% static %}:
{% load static %}
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="{% static 'css/stile.css' %}">
</head>
<body>
<img src="{% static 'img/logo.png' %}" alt="Logo">
<script src="{% static 'js/script.js' %}"></script>
</body>
</html>
Il tag {% load static %} deve essere presente in ogni template che utilizza {% static %}. Non viene ereditato automaticamente dai template base.
Servire File Statici in Sviluppo
Durante lo sviluppo, Django serve automaticamente i file statici se DEBUG = True e django.contrib.staticfiles e presente in INSTALLED_APPS:
# settings.py
INSTALLED_APPS = [
'django.contrib.staticfiles',
# ... altre app
]
DEBUG = True
Non serve aggiungere nulla a urls.py quando usi runserver con DEBUG = True.
Il Comando collectstatic
Per la produzione, devi raccogliere tutti i file statici in una singola directory con il comando collectstatic:
python manage.py collectstatic
Questo comando copia tutti i file statici da ogni app e da STATICFILES_DIRS nella directory STATIC_ROOT. In produzione, il server web (Nginx, Apache) servira i file da questa cartella.
Usare File Statici nei File CSS
Per referenziare immagini o font allâinterno dei file CSS, usa percorsi relativi:
/* static/css/stile.css */
body {
background-image: url('../img/sfondo.jpg');
}
@font-face {
font-family: 'MioFont';
src: url('../fonts/miofont.woff2') format('woff2');
}
Configurazione per la Produzione
In produzione con Django 5.x, puoi usare ManifestStaticFilesStorage per aggiungere hash ai nomi dei file e migliorare il caching:
# settings.py (produzione)
STORAGES = {
'staticfiles': {
'BACKEND': 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage',
},
}
Conclusione
Il sistema di file statici di Django semplifica la gestione degli asset del progetto. Con la configurazione corretta di STATIC_URL, STATICFILES_DIRS e STATIC_ROOT, il tag {% static %} nei template e il comando collectstatic per la produzione, hai tutto il necessario per gestire CSS, JavaScript e immagini in modo efficiente e organizzato.