Qual è il punto della collettività di Django?


92

Questa è probabilmente una domanda stupida, ma semplicemente non mi scatta in testa.

In Django, la convenzione è quella di mettere tutti i tuoi file statici (cioè css, js) specifici della tua app in una cartella chiamata static . Quindi la struttura sarebbe simile a questa:

mysite/
    manage.py
    mysite/ --> (settings.py, etc)
    myapp/ --> (models.py, views.py, etc)
        static/

In mysite/settings.pyho:

STATIC_ROOT = 'staticfiles'

Quindi, quando eseguo il comando:

python manage.py collectstatic   

Crea una cartella chiamata staticfilesa livello di root (quindi la stessa directory di myapp/)

Qual è il punto di questo? Non si tratta solo di creare una copia di tutti i miei file statici?

Risposte:


72

Raccogli file statici da più app in un unico percorso

Beh, un singolo Django progetto può utilizzare diverse applicazioni , quindi mentre ci si ha un solo myapp, si può effettivamente essere myapp1, myapp2ecc

Copiandoli dall'interno delle singole app in una singola cartella, puoi puntare il tuo server web frontend (es. Nginx) a quella singola cartella STATIC_ROOT e servire file statici da una singola posizione, piuttosto che configurare il tuo server web per servire file statici da più percorsi .

URL persistenti con ManifestStaticFilesStorage

Una nota sull'hash MD5 aggiunto al nome del file per il controllo delle versioni: non fa parte del comportamento predefinito di collectstatic, come settings.STATICFILES_STORAGEpredefinito StaticFilesStorage(che non lo fa)

L'hash MD5 si attiverà, ad esempio, se lo si imposta per l'uso ManifestStaticFilesStorage, quale annuncio tale comportamento.

Lo scopo di questa memoria è di continuare a servire i vecchi file nel caso in cui alcune pagine facciano ancora riferimento a quei file, ad esempio perché sono memorizzati nella cache da te o da un server proxy di terze parti. Inoltre, è molto utile se desideri applicare le intestazioni Expires in un futuro lontano ai file distribuiti per accelerare il tempo di caricamento per le successive visite alle pagine.


3
vuoi dire che sarà facile trovare il server web per servire il contenuto statico
babygame0ver

46

I file statici di Django possono trovarsi in molti posti. Un file che viene servito come /static/img/icon.pngpotrebbe provenire da molti posti . Per impostazione predefinita:

  • FileSystemFindercercherà img/icon.pngin ciascuno di STATICFILES_DIRS,
  • AppDirectoriesFindercercherà img/icon.pngnella staticsottocartella in ognuno dei tuoi file INSTALLED_APPS. Ciò consente a librerie come Django Admin di aggiungere i propri file statici alla tua app.

Ora: funziona solo se esegui manage.py runservercon DEBUG = 1. Quando vai in diretta, il processo Django non servirà più le risorse statiche. Sarebbe inefficiente usare Django per servirli, ci sono strumenti più specializzati specificamente per questo.

Invece, dovresti fare qualcosa del genere:

  • trova tutti i file statici da ogni app
  • costruire una singola directory che li contenga tutti
  • caricali da qualche parte (una staticdirectory da qualche parte sul tuo server web o un archivio di file di terze parti)
  • configura il tuo server web (come nginx) per servire /static/*direttamente da quella directory e reindirizzare qualsiasi altra richiesta a Django.

collectstatic è uno script già pronto che prepara questa directory per te, in modo che tu possa collegarla direttamente al tuo script di distribuzione.


25

Nell'installazione di produzione, desideri avere URL persistenti. L'URL non cambia a meno che il contenuto del file non cambi.

Questo per evitare che i client abbiano una versione sbagliata del file CSS o JS sul proprio computer quando aprono una pagina web da Django. Django staticfiles rileva le modifiche ai file e aggiorna gli URL di conseguenza, in modo che se il file CSS o JS cambia, il browser web scarica la nuova versione.

Questo di solito si ottiene aggiungendo l'hash MD5 al nome del file durante l' collectstaticesecuzione.

Modifica: vedi anche la risposta correlata a più app.


1
Buono! Non lo sapevo
doniyor

"di solito si ottiene aggiungendo hash MD5" intendi ManifestStaticFilesStorage ? Bello, non l'ho visto
Kos il

3
Penso che per impostazione predefinita non ci sia hashing MD5 in corso, poiché l' settings.STATICFILES_STORAGEimpostazione predefinita è StaticFilesStorage, quindi l'MD5 si avvia solo dopo averlo impostato, ad esempio ManifestStaticFilesStorage, ho ragione?
Bakkal

@MikkoOhtamaa Ma allora come fa l'app di frontend a sapere a quale nome di file deve collegarsi visto che quest'ultimo cambia sempre?
lapin

@lapin Bella domanda! Naturalmente deve esistere 1) mappatura alle ultime versioni e 2) modalità per comunicarlo. Di solito è memorizzato in un file da qualche parte e poi quando chiedi "quale URL completo per l'ultima versione di X" ti dà un risultato.
Mikko Ohtamaa

10

È utile quando ci sono più app django all'interno del sito.

collectstatic raccoglierà quindi i file statici da tutte le app in un unico posto, in modo che possa essere offerto in un ambiente di produzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.