2012-02-02 16 views
6

Sto pianificando un nuovo progetto Django e voglio ottenere tutto giusto e cose del genere. Mi sono imbattuto nella domanda su come organizzare il layout della directory del progetto. Fortunatamente, ci sono alcuni esempi di buoni modelli di progetto disponibili sul web. Tuttavia, c'è una cosa che faccio fatica a mettermi in testa:Posizioni di modelli e file statici in Django

È il modo consigliato di mettere i file modello in una directory separata sotto la radice del progetto che è divisa in sottodirectory per app. Pertanto, i modelli non si trovano all'interno delle directory dell'app. Ciò mi sembra logico dal momento che vogliamo separare la logica dell'applicazione dalla logica di rappresentazione. Ma per quanto riguarda i file statici? Qui, la pratica comune sembra essere quella di localizzare i file statici all'interno delle directory dell'app e caricarli in una directory 'statica' sotto la radice del progetto in fase di sviluppo (collectstatic). E questa logica non capisco. Poiché i file statici (ad es. Js, css, images) sono generalmente accessibili nei modelli, non all'interno del codice dell'applicazione, li conterei per la logica di presentazione. Allora perché non sono memorizzati proprio come i modelli: una directory sotto la root del progetto, con sottodirectory per le singole app?

So che posso archiviare questi file dove voglio ma immagino ci possa essere una buona ragione per cui la gente lo fa in questo modo. Quale potrebbe essere questa ragione?

risposta

8

I file statici possono essere inseriti nell'app correlata nello stesso modo in cui i modelli relativi a un'app specifica vengono spesso inseriti nella directory dell'applicazione.

A volte, ha senso. A volte, non è così ... è la tua chiamata.

Ad esempio, inserisco il supporto statico in una directory site_media (css globale, immagini globali, ecc.) Ma inserisco supporti specifici per app in app/static. Ad esempio, se ho un'app Poll, è probabile che i miei file multimediali siano necessari solo per i modelli di app sondaggio e non per l'indice del mio sito.

Lo stesso vale per i modelli: inserisco i miei modelli globali (base.html) in una directory modello globale, ma i modelli specifici delle app vanno in myapp/templates/myapp/foo.html.

Infine, ha particolarmente senso per app collegabili. Ad esempio, i file statici di django vengono archiviati nell'app ma diventano accessibili nella directory dei file statici anche se l'app risiede in qualche punto del percorso Python. In precedenza, si sarebbe dovuto copiare la directory multimediale o il collegamento simbolico ad esso.

L'app staticfiles brilla davvero perché consente di organizzare tutti i file correlati a un'applicazione in un unico punto: la cartella dell'applicazione. collectstatic si prende cura di tutto il resto e rende tutto disponibile in un'unica posizione per un server web.

+0

Vedo che l'organizzazione di modelli e file statici all'interno delle directory dell'app ha senso per le app collegabili. Ma non c'è alcun vantaggio se non ho intenzione di creare app collegabili, non è vero? Avrei semplicemente il sovraccarico di chiamare "collectstatic" ogni volta che distribuisco una nuova versione del mio progetto. – j0ker

+0

@ J0ker, che è discutibile ed è completamente la tua chiamata. A volte, se si tratta di un'app discretamente impacchettata, mi trovo a utilizzare 'app/static'. Altre volte, per un gruppo di app tutte relative al sito web principale, utilizzo semplicemente la cartella 'site_media'. L'overhead di chiamare "collectstatic" viene rimosso per me poiché utilizzo uno script di fabric che lo usa comunque. PLUS <è estremamente utile che se si configura un back-end di storage staticfiles, è possibile caricare collectstatic su amazon S3. –

5

In realtà ho messo i modelli nella directory per ogni app e penso che abbia senso. Hai ancora la separazione della separazione logica poiché tutto il resto sta accadendo nei file Python.

Tuttavia, inserendo la directory dei modelli nell'app significa che se l'app è utile per altri progetti, è sufficiente copiare l'app direttamente nel nuovo progetto. E puoi sempre ignorare quei modelli creando quelli alternativi nella cartella dei modelli di root.

È per questo motivo che la directory statica deve anche essere memorizzata nella directory dell'app; ti consente di organizzare in modo molto chiaro le risorse in base a ciò che è necessario per una specifica app ed è per questo che l'app staticfiles è stata creata in primo luogo.

Problemi correlati