2009-08-28 4 views
5

Ho un progetto Django che viene installato dai clienti sui loro server. Ho alcune app in più che sono plug-in opzionali di funzionalità che possono essere installate/disinstallate.Qual è un buon modo per pacchettizzare le app di django?

Mi piacerebbe un modo semplice per impacchettare queste app per plug-in per rendere l'installazione/disinstallazione indolore. Non voglio che copino i file modello in una directory, nell'app in un'altra, i supporti in una terza e così via. Preferirei che non abbiano bisogno di modificare settings.py, anche se va bene se non può essere aiutato.

La situazione ideale sarebbe se potessero semplicemente decomprimere in una posizione sul percorso Python (forse una directory speciale del plugin?), Ed eliminarlo per disinstallarlo. C'è un modo semplice per impacchettare le app in modo che possano essere installate in questo modo?

risposta

4

Salterò la discussione sulla confezione Python (distutils, setuptools, pip, ecc.), Poiché sembra che preferireste usare semplici file zip o tarball. Mi rivolgo il "dolore punti" si parlano uno alla volta:

file dei modelli: Finché si dispone di 'django.template.loaders.app_directories.load_template_source' incluso nella cornice TEMPLATE_LOADERS dei vostri progetti, non dovresti preoccuparti di questo. Ciascuna delle tue app può avere una sottodirectory "templates /", ei modelli in essi verranno caricati proprio come se fossero nella directory dei modelli del tuo progetto.

File multimediali: i media delle app sono un problema. Per lo sviluppo, è possibile utilizzare una vista serve_media personalizzata che funziona in modo simile al caricatore di template app_directories (cerca i media in ogni app). In produzione, è necessario copiare i file, utilizzare collegamenti simbolici o utilizzare alias a livello di server Web. Ci sono diverse app di utilità là fuori che cercano di appianare questo problema; Ora utilizzo django-staticfiles.

Modifica impostazioni.py: non c'è modo semplice per aggirare questo. Per i suoi modelli, tag modello, comandi di gestione, ecc. Per funzionare, un'app deve essere elencata in INSTALLED_APPS. Quello che potresti fare è scrivere un codice personalizzato nel tuo settings.py che elenca i contenuti di una determinata directory e aggiunge dinamicamente i pacchetti che trova lì su INSTALLED_APPS. Un po 'pericoloso (pensa attentamente a chi ha i permessi per inserire i file in quella directory, perché hanno le chiavi del tuo regno), e i nuovi file verranno rilevati solo su un server di ricarica, ma dovrebbe funzionare.

Penso che se si mettono insieme queste soluzioni, è possibile raggiungere la situazione ideale: decomprimere per installare, eliminare per disinstallare.

+0

Grazie per il collegamento a djano-media-utils. Questo è il più grande dolore nel meccanismo. Vorrei poter specificare più dirs multimediali. Immagino che aggiungere dinamicamente a INSTALLED_APPS sia un'opzione. Dal momento che è necessario accedere al server per posizionare il plugin, la persona che installa ha comunque accesso a tutti i file. Hai provato prima? – Siddhi

+0

No, non ho mai provato un'impostazione dinamica INSTALLED_APPS. Nel concetto non c'è niente di troppo complicato a riguardo. In pratica, un problema potrebbe essere la necessità di riavviare il server Web di produzione ogni volta che le app vengono aggiunte/rimosse dalla directory dei plug-in. Inoltre, se le app di plugin possono includere modelli, è necessario un piano per rendere possibile il syncdb necessario. –

0

Editing settings.py: il plugin in grado di leggere le impostazioni dalle proprie impostazioni file nella propria directory. Avrebbero solo bisogno di modificare le impostazioni root.py per aggiungere/rimuovere il percorso del plug-in da "INSTALLED_APPS".