2010-03-07 36 views
5

Necesito almacenar la configuración para mi proyecto de Google App Engine. Actualmente tengo:almacenar la configuración de la aplicación en Google App Engine

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

Y cuando quiero usarlo:

Settings.get_or_insert('settings') 

Esto se siente torpe así que hay una manera mejor (sin utilizar Django)?

+0

¿Cambiará la configuración entre las implementaciones de las versiones de la aplicación? –

+0

Sí, y también se puede actualizar durante la implementación – hoju

Respuesta

4

Por favor aclare qué le parece "torpe" a usted sobre esto - eso no es muy claro para mí.

El almacén de datos es el forma de conservar datos actualizables en App Engine (blobstore's para blobs enormes, no se garantiza la persistencia de memcache). Si la aplicación no puede cambiar sus configuraciones, por supuesto, puede colocarlas en su propio archivo personalizado .yaml (o lo que sea, pero así es como los propios archivos de configuración de App Engine ya están almacenados ... ;-); Recuerde que todos estos archivos son de solo lectura desde el punto de vista de la aplicación. YAML está convenientemente disponible para las aplicaciones de App Engine para analizar sus propios archivos .yaml (pero de "solo lectura").

+0

me parece torpe porque estoy forzando a un modelo a tener solo una instancia – hoju

+0

Richard, no hay nada de malo en tener un singleton que esté de vuelta en el almacén de datos. Lo que realmente desea considerar es que, por motivos de rendimiento, querrá mantener esta entidad en Memcache y escribirla en el almacén de datos cada vez que cambie. –

+0

@ Adam, estoy totalmente de acuerdo: no se garantiza que Memcache se mantenga, pero será más rápido si sucede ;-). @Richard, punto es, el almacén de datos es todo lo que tienes (para almacenamiento garantizado persistente). Si tiene muchas "partes y piezas" diferentes que necesita persistir, podría usar un modelo amorfo para almacenar cualquiera de ellas (como un blob en escabeche), pero eso no es necesariamente más elegante. –

0

En mis proyectos, puse los datos de configuración del almacén de datos (un registro por valor de configuración) usando esta clase:

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 

su aplicación haría esto para obtener un valor:

API_KEY = Settings.get('API_KEY') 

Si hay un valor para esa clave en el almacén de datos, la obtendrá. Si no lo hay, se creará un registro de marcador de posición y se lanzará una excepción. La excepción le recordará que vaya a Developers Console y actualice el registro de marcador de posición.

Creo que esto elimina las conjeturas de la configuración de los valores de configuración. Si no está seguro de los valores de configuración que debe establecer, ejecute el código y se lo indicará.