2010-03-07 23 views
5

Ho bisogno di memorizzare le impostazioni per il mio progetto di Google App Engine. Attualmente ho:memorizzazione impostazioni app su Google App Engine

class Settings(db.Model): 
    rate = db.IntegerProperty(default=4) 
    ... 

E quando voglio usarlo:

Settings.get_or_insert('settings') 

Questo si sente goffa è così c'è un modo migliore (senza l'utilizzo di Django)?

+0

Le impostazioni cambieranno tra le distribuzioni delle versioni dell'applicazione? –

+0

sì, e può essere aggiornato anche durante la distribuzione – hoju

risposta

4

Per favore, chiarisci cosa ti "fa sentire maldestro" su questo - non è molto chiaro per me.

Il datastore è il modo per mantenere i dati aggiornabili in App Engine (blobstore per enormi blob, memcache non garantito). Se le tue impostazioni non possono essere modificate dall'applicazione, ovviamente puoi semplicemente inserirle nel tuo file personalizzato .yaml (o qualsiasi altra cosa, ma yaml è come i file di configurazione di App Engine sono già archiviati comunque ... ;-); ricorda che tutti questi file sono di sola lettura dal punto di vista dell'applicazione. YAML è comodamente disponibile per le app di App Engine per analizzare i propri file .yaml (ma "di sola lettura").

+0

mi sembra goffo perché sto costringendo un modello ad avere una sola istanza – hoju

+0

Richard, non c'è niente di sbagliato nell'avere un singleton che è tornato dal datastore. L'unica cosa che vuoi veramente considerare è che, per motivi di prestazioni, ti consigliamo di mantenere questa entità in memcache e scriverla su un archivio dati ogni volta che cambia. –

+0

@Adam, sono completamente d'accordo - memcache non è garantito per _stay_ around, ma sarà più veloce se succede ;-). @Richard, il punto è, il datastore è tutto ciò che hai (per la memoria persistente garantita). Se hai molti "pezzi" diversi da perseguire, puoi usare un modello amorfo per archiviarne uno (come un blob decapato), ma non è necessariamente più elegante. –

0

Nei miei progetti, ho messo i dati di configurazione nel datastore (un record per il valore di configurazione) utilizzando questa classe:

from google.appengine.ext import ndb 

class Settings(ndb.Model): 
    name = ndb.StringProperty() 
    value = ndb.StringProperty() 

    @staticmethod 
    def get(name): 
    NOT_SET_VALUE = "NOT SET" 
    retval = Settings.query(Settings.name == name).get() 
    if not retval: 
     retval = Settings() 
     retval.name = name 
     retval.value = NOT_SET_VALUE 
     retval.put() 
    if retval.value == NOT_SET_VALUE: 
     raise Exception(('Setting %s not found in the database. A placeholder ' + 
     'record has been created. Go to the Developers Console for your app ' + 
     'in App Engine, look up the Settings record with name=%s and enter ' + 
     'its value in that record\'s value field.') % (name, name)) 
    return retval.value 

L'applicazione farebbe questo per ottenere un valore:

API_KEY = Settings.get('API_KEY') 

Se c'è un valore per quella chiave nel datastore, lo otterrete. In caso contrario, verrà creato un record segnaposto e verrà generata un'eccezione. L'eccezione ti ricorderà di andare alla Developers Console e aggiornare il record del segnaposto.

Trovo che questo toglie l'ipotesi di impostare i valori di configurazione. Se non sei sicuro di quali valori di configurazione impostare, esegui il codice e questo ti dirà!