2010-09-23 11 views
14

Estoy haciendo una aplicación de Google App Engine y estoy dudando si debo almacenar los datos de configuración (confidenciales) como las credenciales.¿Cuál es un buen lugar para almacenar la configuración en Google App Engine (python)

¿Debo hacer una única entidad de tabla grande para la configuración, o hay otra forma recomendada de almacenarla.

+0

¿qué tipo de credenciales? – systempuntoout

+0

@systempuntoout Por ejemplo, mis credenciales de Amazon AWS para acceder a S3 –

+0

Si no le gustan sus credenciales simples en su código fuente, la única forma de hacerlo es usar un modelo de configuración en el almacén de datos; de lo contrario, podría almacenar su configuración en algún archivo .ini accediendo a él con [ConfigParser] (http://docs.python.org/library/configparser.html). – systempuntoout

Respuesta

17

Si está de acuerdo con incrustarlas en su fuente, puede hacerlo, pero si necesita que se pueda configurar dinámicamente, el almacén de datos es el camino a seguir. Puede evitar recuperar las configuraciones en cada solicitud almacenándolas en la memoria local. Aquí está una clase de ayuda para ello:

class Configuration(db.Model): 
    _INSTANCE = None 

    @classmethod 
    def get_instance(cls): 
    if not cls._INSTANCE: 
     cls._INSTANCE = cls.get_or_insert('config') 
    return cls._INSTANCE 

Simplemente subclase esto con los valores de configuración que necesita lo que sea (o modificar la propia clase). Debido a que el código cargado persiste entre las solicitudes, solo tendrá que realizar una única extracción por instancia de la aplicación, aunque si desea poder actualizar la configuración de forma dinámica, es posible que desee generar un tiempo de espera excedido.

Si desea almacenar en caché cosas por un tiempo limitado, su mejor opción es simplemente el almacenamiento de la marca de tiempo cuando el que obtuvo que:

class Configuration(db.Model): 
    CACHE_TIME = datetime.timedelta(minutes=5) 

    _INSTANCE = None 
    _INSTANCE_AGE = None 

    @classmethod 
    def get_instance(cls): 
    now = datetime.datetime.now() 
    if not cls._INSTANCE or cls._INSTANCE_AGE + cls.CACHE_TIME < now: 
     cls._INSTANCE = cls.get_or_insert('config') 
     cls._INSTANCE_AGE = now 
    return cls._INSTANCE 
+0

Muy interesante, nunca había visto esta técnica antes.Normalmente, utilizaría Memcache para minimizar el número de recuperaciones desde el almacén de datos, pero parece que será aún más rápido, siempre que se cargue la instancia. ¿Algún límite de memoria que impida usar demasiado esto? – Franck

+0

Sí, hay límites de memoria, aunque están sujetos a cambios. Probablemente no deba usar la memoria de instancia para el almacenamiento en caché generalizado, pero es ideal para los datos de configuración. –

+1

Ok gracias, lo tendré en cuenta. ¿Tiene algún indicador sobre cómo construir el tiempo de espera del que estaba hablando? – Franck

10

Guárdelos en un módulo. Usted puede ir sencilla, como tener un módulo config.py con, por ejemplo:

AMAZON_KEY = 'XXXX' 

A continuación, utilice:

import config 
service = my_amazon_service(config.AMAZON_KEY) 

o tener un objeto de configuración un poco más sofisticado que le permite tener los valores iniciales adecuados para su aplicación, teclas de configuración espaciadas por nombre, etc.

4

Si se trata de datos sensibles, no se debe almacenar en código fuente, ya que será verificado en el control de la fuente. Las personas equivocadas (dentro o fuera de su organización) pueden encontrarlo allí. Además, su entorno de desarrollo probablemente utiliza diferentes valores de configuración de su entorno de producción. Si estos valores se almacenan en código, tendrá que ejecutar un código diferente en el desarrollo y la producción, lo cual es una práctica desordenada y mala.

En mis proyectos, poner los datos de configuración del almacén de datos 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:

AMAZON_KEY = Settings.get('AMAZON_KEY') 

Si hay un valor para ese clave en el almacén de datos, lo 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á.

+1

Bien hecho, funciona como un encanto, ¡también he añadido un método establecido! –

Cuestiones relacionadas