2009-12-02 7 views
9

In Django, le impostazioni sono memorizzate in un file, settings.py. Questo file è parte del codice e va nel repository. Solo gli sviluppatori si occupano di questo file. L'amministratore si occupa dei modelli, i dati nel database. Questi sono i dati che le modifiche del personale non di sviluppo e i visitatori del sito vedono renderizzati nei modelli.Come rendere alcune impostazioni di Django accessibili dallo staff?

Il fatto è che, il nostro sito e molti altri, hanno molte opzioni di impostazione che dovrebbero essere modificate da personale non addetto allo sviluppo. Stiamo parlando di costanti stand-alone in tutto il sito che non hanno davvero spazio nel database. Inserirli nel database comporterà numerose query inutili. Il caching potrebbe alleggerirlo, ma sembra inutilmente complesso gestire ciò che può essere fatto con una singola riga nel file settings.py.

Ho notato this dbsettings app, ma è vecchio e non mantenuto. Ho anche notato che l'app di e-commerce django, Satchmo, include un fork specifico per l'utilizzo di questa app dbsettings. Potremmo creare qualcosa di simile nel nostro sito, un'app che memorizza alcune impostazioni come coppie chiave/valore in una singola tabella di database, ma sembra davvero l'approccio sbagliato. Perché mettere qualcosa nel DB che non ci appartiene solo per renderlo più facilmente modificabile dai non-sviluppatori?

Abbiamo un elenco di impostazioni del sito sul nostro sito Django che vogliamo essere modificabili da amministratori non sviluppatori. Qual è il modo migliore di fare questo?

+0

+1 perché sapendo questo potrebbe rendere più facile la gestione dei progetti Django in VCS. Gli sviluppatori devono fare attenzione a non commettere modifiche locali su settings.py altrimenti. La cache –

+0

allevierà questo (quando le impostazioni locali vengono inserite nel database) a una sola query per istanza del processo django. – Evgeny

+0

per riavviare il server per ricaricare le impostazioni è sufficiente chiamare il file "touch site.wsgi", ad es. con un processo cron, ma funziona solo se il processo wsgi viene eseguito in modalità daemon – Evgeny

risposta

6

Qualcosa come dbsettings (come hai detto) sembra la strada da percorrere. Dal reasons for existence per quel progetto:

Non tutte le impostazioni appartenere a settings.py, in quanto ha alcuni particolari limitazioni:

  • impostazioni sono a livello di progetto-. Ciò non solo richiede alle app di ingombrare lo settings.py, ma aumenta anche le possibilità di denominare i conflitti .

  • Le impostazioni sono costanti durante un'istanza di Django. Non possono essere modificati senza riavviare l'applicazione.

  • Le impostazioni richiedono un programmatore per la modifica. Questo è vero anche se l'impostazione non ha alcun impatto funzionale su qualcos'altro.

Se dbsettings non funziona per voi, allora implementare il proprio, o la forcella esso. Non sembra che sarebbe troppo arduo.

0

ne dici di mettere un sitesettings.py (o altro) da qualche parte che i vostri amministratori possono accedere, poi nel settings.py fare

from sitesettings import * 

che sembra buona e semplice, ma forse ho capito male o semplificato il problema :)

+1

Anche questa soluzione non funziona perché solo i tecnici possono modificare i file sul server e/o riavviare l'apache. – Apreche

6

In realtà sono un grande fan dei dbsettings, e ho intenzione di pubblicare il mio fork che lo patch per funzionare con Django 1.1 (non in realtà un grande cambiamento) . Sembra che qualcuno abbia updated it already.

Tuttavia, probabilmente hai ragione che questo è eccessivo per quello che ti serve.Una cosa che ho fatto prima è aggiungere una riga alla fine di settings.py che importa e analizza un file YAML. YAML è un semplice linguaggio di markup, che nella sua forma più semplice è solo KEY: VALUE ...

CONSTANT1: MyValue 
CONSTANT2: Anothervalue 

Se mettete questo da qualche parte gli editori possono accedere, poi alla fine del settings.py basta fare:

import yaml 
try: 
    globals().update(yaml.load(open('/path/to/my/yaml/file.yml'))) 
except: 
    pass 

Avrete bisogno della libreria Python YAML per analizzare il file YML.

Lo svantaggio di questo approccio è che è necessario riavviare Apache per farlo raccogliere le modifiche.

Modificato per aggiungere Non sarebbe particolarmente difficile creare un front-end che possa modificare questo file e fornire un pulsante che esegua uno script per riavviare Apache.

+0

Questa soluzione non funziona perché solo i tecnici possono modificare i file sul server e/o riavviare l'apache. – Apreche

+0

Non sarebbe particolarmente difficile creare un front-end che possa modificare questo file e fornire un pulsante che esegua uno script per riavviare Apache. –

+1

@Daniel - anche se a quel punto si sta entrando nello stesso tipo di livello di lavoro richiesto da dbsettings. –

1

Se è necessario evitare il riavvio del server, un luogo logico per le impostazioni è il database come ha affermato Dominic e Daniel, ma è necessario annullare l'oggetto delle impostazioni memorizzate nella cache ogni volta che viene aggiornato.

Sembra che sia possibile reimpostare i valori nella cache con Django low level cache API. Tutto ciò che vuoi dovrebbe essere raggiungibile con queste chiamate:

cache.set('settings', local_settings) 
cache.add('settings', local_settings) 
local_settings = cache.get('settings') 
cache.delete('settings') 
Problemi correlati