2012-07-23 9 views
7

La documentazione Django afferma chiaramentePerché le impostazioni di django non dovrebbero essere modificate in fase di esecuzione?

Si consiglia di non modificare le impostazioni nelle applicazioni in fase di esecuzione.

Ecco il link to that statement

La mia domanda è, perché è così? Voglio aggiungere applicazioni dinamicamente in fase di runtime e aggiungere database in fase di runtime, entrambi che comportano la modifica delle impostazioni. Qualcuno può spiegare perché le impostazioni non devono essere modificate in fase di esecuzione e se esistono eccezioni, quali impostazioni sono e perché sono eccezionali? Non sono molto interessato a come raggiungere il mio obiettivo, ma nel motivo per cui le impostazioni non devono essere modificate.

+0

Ho dato un'occhiata a https://docs.djangoproject.com/en/dev/ref/settings/, e mi sembra che queste siano tutte le impostazioni che si applicano all'avvio dell'applicazione *. Di conseguenza, non sarebbe ha molto senso modificarli in fase di runtime. –

risposta

5

La maggior parte delle impostazioni non verrà riletta se le si cambia in fase di esecuzione. Quindi Django non riconoscerà i cambiamenti che fai.

Ciò è dovuto al fatto che Django è solo un normale codice Python. Non è come un server che sta monitorando il tuo codice: è solo una parte del tuo codice.

In alcuni casi, parti del codice Django potrebbero rispondere alle modifiche delle impostazioni, poiché potrebbero fare "impostazioni.DEFAULT_FROM_EMAIL" ogni volta che viene inviata una mail, ad esempio.

Ma se Django elabora le impostazioni in qualche modo, come deve fare per INSTALLED_APPS, non noterà che hai cambiato qualcosa e rifai l'elaborazione.

Quali impostazioni sono sicure? Bene, i documenti dicono "nessuno è sicuro", perché potrebbe cambiare in futuro. Django potrebbe salvare una copia di qualsiasi impostazione per qualche motivo o eseguire qualche elaborazione.

La modifica di INSTALLED_APPS non può mai essere eseguita, perché altera i moduli importati. Semplicemente non c'è modo in cui Django possa funzionare nel modo in cui Python funziona a questo livello - dovrebbe essere in grado di "non importare" i moduli, che è fondamentalmente impossibile (l'unico modo è riavviare il processo), e ci sono altri problemi associati ai collegamenti tra app.

1

AFAIK non c'è documentazione su quali impostazioni siano modificabili in modo sicuro in fase di esecuzione, ma è presente un open ticket che richiede che vengano documentate in modo più chiaro.

+0

Che ne dici della propria variabile di impostazione? per esempio. creare un dizionario vuoto nelle impostazioni e aggiungere dati ad esso nel periodo in cui il sistema è in esecuzione (in questo caso è irrilevante se i dati vengono persi al riavvio del sistema). – Derek

1

Se si prende uno look under the hood nell'oggetto delle impostazioni Django espone all'interfaccia con il modulo delle impostazioni del progetto, si noterà che non c'è nulla che impedisca di modificare dinamicamente le impostazioni in fase di esecuzione.

Dovresti, tuttavia, apprezzare che l'architettura del framework è costruita attorno a un flusso di richiesta-risposta in cui viene condiviso un sacco di stato globale tra i thread per l'ottimizzazione della memoria, in base alla premessa che l'applicazione è configurata una sola volta durante l'inizializzazione .

Problemi correlati