[Python] Django file "statici"

Alessandro Dentella sandro a e-den.it
Mar 17 Feb 2015 09:30:21 CET


Ciao Ivan,

On Mon, Feb 16, 2015 at 08:11:22PM +0100, Ivan B. wrote:
> 
> Il 16/02/2015 19:41, Alessandro Dentella ha scritto:
> >Che ne dici se ci dividiamo il lavoro? Tu comincia a dirci cosa
> >non hai capito, cosa hai fatto e come hai dedotto che non
> >funziona... e postaci anche la configurazione... Hai pb col
> >runserver o sotto nginx? sandro *:-)
> 
> Effettivamente sono stato un po' poco chiaro ^^
> I problemi, per il momento, sono sotto runserver.

Ok, leggi allora proprio fino in fondo...

> Quello che non capisco è come configurare la directory per gli
> static file e come richiamarla nei template.
> 
> Ok, ecco cosa ho combinato.
> 
> In settings.py ho inserito:
> STATIC_URL = '/static/'

ok, questo cambia come chiamerai i file, non quali e dove sono/li metti

> e controllato che ci fosse 'django.contrib.staticfiles' in installed_apps

Questo garantisce che esista il comando staticfiles

> Nel template ho inserito:
> {% load staticfiles %}
> <img src="{% static "img/prova.png" %}" alt="Prova" />

Secondo me sei già troppo avanti nel debug, fai un pezzo alla
volta. Cerca prima di capire se i file finiscono nel posto giusto

Quello che non vedo nella tua conf è la configurazione del meccanismo
degli staticfiles:

  STATICFILES_DIRS
  STATICFILES_FINDERS
  STATIC_ROOT

che puoi leggere rapidamente con "manage.py diffsettings | grep
STATIC" sotto linux e mac.

Il meccanismo degli static file sostanzialmete prevede 

* una configurazione per definire i raccoglitori (FINDERS)
* una configuraione per definire la cartella di destinazione
  (STATIC_ROOT)

I finders di default raccolgono da

* applicazioni:
  django.contrib.staticfiles.finders.AppDirectoriesFinder

* filesystem: django.contrib.staticfiles.finders.FileSystemFinder
  Questo a sua volta necessita di STATICFILES_DIRS (una tupla) per
  capire da dove raccogliere

La mia configurazione è così:

STATICFILES_DIRS = ('{PRJ}/web/static_manual',)
STATICFILES_FINDERS = (
		    'django.contrib.staticfiles.finders.FileSystemFinder', 
		    'django.contrib.staticfiles.finders.AppDirectoriesFinder', 
		    )
STATIC_ROOT = '{PRJ}/web/static_auto'
STATIC_URL = '/static/'

dove {PRJ} lo sostituisci con la root del tuo progetto.

Il nome *static_manual* suggerisce che è una cartella dove metto a mano
gli statici del progetto, *static_auto* è quella dove il comando
collectstatic copia i file prelevandoli da dove è istruito (apps e
fylesystem).

> Il mio progettino di test si chiama (che fantasia) progetto. La
> directory static che contiene a sua volta "/img/prova.png" ho
> provato a posizionarla nella root di progetto (dove c'è manage.py),
> all'interno di "progetto/progetto/" e all'interno di
> "progetto/progetto/templates". In nessuna delle tre prove sono

non la metterei nei templates, il resto va bene, pur di dichiararla
nella STATIC_ROOT.

Ma non mi pare che tu abbia chiaro il ruolo di STATICFILES_DIRS.
Io non metto mai nulla in static_auto  (La mia STATIC_ROOT) che lascio
riempire a mano. Il motivo è banale: quella contiene file che non
vogli tracciare con mercurial, mentre la static_maual (dichiarata in
STATICFILES_DIRS è composta di file che tengo sotto controllo di
versione.

DEBUG
=====


A questo punto ti suggerisco di lanciare manage.py collectstatic e
verificare se i file arrivano al posto giusto (nella STATIC_ROOT) e
solo dopo che te ne sei accertato arriverai al debug del template.

RUNSERVER
=========

Quando usi il runserver non ti serve neanche passare dalla cartella
STATIC_DIR se in urls.py del progetto hai qualcosa tipo:

  urlpatterns += staticfiles_urlpatterns()

Risulta pratico per lo sviluppo. Ma prima di usare questo termina con
successo gli altri passaggi.


sandro
*:-)

-- 
Sandro Dentella  *:-)
http://www.reteisi.org             Soluzioni libere per le scuole
http://sqlkit.argolinux.org        SQLkit home page - PyGTK/python/sqlalchemy





Maggiori informazioni sulla lista Python