2010-03-07 8 views
5

Je dois stocker les paramètres de mon projet Google App Engine. Actuellement, j'ai:Enregistrement des paramètres de l'application sur Google App Engine

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

Et quand je veux l'utiliser:

Settings.get_or_insert('settings') 

Cela se sent maladroit est donc là une meilleure façon (sans utiliser Django)?

+0

Les paramètres changeront-ils entre les déploiements de versions de l'application? –

+0

oui, et peut être mis à jour pendant le déploiement aussi – hoju

Répondre

4

Veuillez clarifier ce que vous «ressentez maladroite» à ce sujet - ce n'est pas très clair pour moi.

La banque de données est la méthode pour conserver les données pouvant être mises à jour dans App Engine (blobstore pour les gros blobs, memcache n'est pas garanti permanent). Si vos paramètres ne peuvent pas être modifiés par l'application, vous pouvez simplement les mettre dans votre propre fichier personnalisé .yaml (ou autre chose, mais yaml est comment les fichiers de configuration d'App Engine sont déjà stockés de toute façon ... ;-); rappelez-vous juste que tous ces fichiers sont en lecture seule du point de vue de l'application. YAML est commodément disponible pour les applications App Engine pour l'analyse de leurs propres fichiers .yaml (mais "en lecture seule").

+0

me semble maladroit parce que je force un modèle à avoir une seule instance – hoju

+0

Richard, il n'y a rien de mal à avoir un singleton qui est de retour par la banque de données. La seule chose que vous voulez vraiment considérer est que pour des raisons de performance, vous voudrez garder cette entité dans memcache, et l'écrire dans le magasin de données chaque fois qu'il changera. –

+0

@Adam, je suis entièrement d'accord - memcache n'est pas garanti à _stay_ autour, mais il sera plus rapide si cela arrive à ;-). @Richard, le point est, le datastore est tout ce que vous avez (pour le stockage garanti persistant). Si vous avez besoin de beaucoup de «pièces et morceaux» différents, vous pouvez utiliser un modèle amorphe pour stocker l'un d'entre eux (comme un blob décapé), mais ce n'est pas forcément plus élégant. –

0

Dans mes projets, je mets des données de configuration dans le magasin de données (un enregistrement par valeur de configuration) en utilisant cette 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 

Votre demande serait faire pour obtenir une valeur:

API_KEY = Settings.get('API_KEY') 

S'il existe une valeur pour cette clé dans le magasin de données, vous l'obtiendrez. Si ce n'est pas le cas, un enregistrement d'espace réservé sera créé et une exception sera générée. L'exception vous rappellera d'aller à la Developers Console et de mettre à jour l'enregistrement d'espace réservé.

Je trouve que cela permet de ne pas deviner les valeurs de configuration. Si vous n'êtes pas sûr de ce que les valeurs de configuration à définir, il suffit de lancer le code et il vous le dira!