2010-03-07 10 views
5

Ich muss Einstellungen für mein Google App Engine-Projekt speichern. Zur Zeit habe ich:Speichern von App-Einstellungen in Google App Engine

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

Und wenn ich will, es benutzen:

Settings.get_or_insert('settings') 

Das fühlt sich ungeschickt, so gibt es eine bessere Art und Weise (ohne Django)?

+0

Werden die Einstellungen zwischen den Bereitstellungen von Versionen der Anwendung geändert? –

+0

Ja, und kann auch während der Bereitstellung aktualisiert werden – hoju

Antwort

4

Bitte klären Sie, was sich Ihnen dabei "plump" anfühlt - das ist mir nicht ganz klar.

Der Datenspeicher ist die Weise aktualisierbare Daten in App Engine persistieren (Blobstore die für große Kleckse, ist memcache nicht dauerhaft garantiert). Wenn Ihre Einstellungen nicht von der Anwendung geändert werden können, können Sie sie einfach in Ihre eigene benutzerdefinierte .yaml Datei (oder was auch immer, aber yaml ist wie App Engine eigenen Konfigurationsdateien sowieso schon gespeichert sind ... ;-); Denken Sie daran, dass alle diese Dateien schreibgeschützt sind. YAML ist für App Engine-Apps praktisch verfügbar, um ihre eigenen .yaml (aber "schreibgeschützten") Dateien zu analysieren.

+0

fühlt sich ungeschickt an, weil ich ein Modell zwinge, nur eine einzige Instanz zu haben – hoju

+0

Richard, es ist überhaupt nichts falsch mit einem Singleton, der durch den Datenspeicher zurück ist. Die eine Sache, die Sie wirklich berücksichtigen möchten, ist, dass Sie diese Entität aus Gründen der Leistung in Memcache behalten und sie bei jeder Änderung in den Datenspeicher schreiben möchten. –

+0

@Adam, stimme ich völlig zu - Memcache ist nicht garantiert, _stay_ herum, aber es wird schneller sein, wenn es passiert ;-). @Richard, Punkt ist, der Datenspeicher ist alles, was Sie haben (für dauerhaften garantierten Speicher). Wenn Sie viele verschiedene "Bits and Pieces" haben, die Sie beibehalten müssen, können Sie ein amorphes Modell verwenden, um eines davon zu speichern (als ein gebeizter Blob), aber das ist nicht unbedingt eleganter. –

0

In meinen Projekten habe ich Konfigurationsdaten im Datenspeicher (ein Datensatz pro config-Wert) dieser Klasse mit:

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 

Ihre Anwendung dieser Wert zu erhalten tun würde:

API_KEY = Settings.get('API_KEY') 

Wenn für diesen Schlüssel ein Wert im Datenspeicher vorhanden ist, erhalten Sie ihn. Ist dies nicht der Fall, wird ein Platzhaltereintrag erstellt und eine Ausnahme ausgelöst. Die Ausnahme erinnert Sie daran, zur Entwicklerkonsole zu wechseln und den Platzhalterdatensatz zu aktualisieren.

Ich finde, dass dies das Erraten der Einstellung der Konfigurationswerte erspart. Wenn Sie sich nicht sicher sind, welche Konfigurationswerte eingestellt werden sollen, führen Sie einfach den Code aus und es wird Ihnen sagen!