Je fais une application Google AppEngine et je doute que je devrais stocker des données de configuration (sensibles) comme les informations d'identification. Dois-je créer une seule entité bigtable pour la configuration ou y a-t-il un autre moyen conseillé de la stocker?Quel est un bon endroit pour stocker la configuration dans Google AppEngine (python)
Répondre
Si vous acceptez de les intégrer dans votre source, vous pouvez le faire, mais si vous avez besoin d'une configuration dynamique, la banque de données est la solution. Vous pouvez éviter d'extraire les paramètres de chaque requête en les mettant en cache dans la mémoire locale. Voici une classe d'aide pour que:
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
sous-classe Simplement ceci avec ce que les valeurs de configuration dont vous avez besoin (ou modifier la classe elle-même). Étant donné que le code chargé persiste entre les demandes, vous n'aurez à effectuer qu'un seul chargement par instance d'application. Toutefois, si vous souhaitez pouvoir mettre à jour la configuration de manière dynamique, vous pouvez créer un délai d'expiration.
Si vous voulez mettre en cache des choses pour un temps limité, votre meilleure option est simplement stocker l'horodatage lorsque vous allai le chercher:
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
Très intéressant, je n'ai jamais vu cette technique auparavant.Typiquement j'utiliserais memcache afin de minimiser le nombre d'extractions à partir du magasin de données, mais cela semble être encore plus rapide tant que l'instance est chargée. Toute limite de mémoire qui empêcherait de trop l'utiliser? – Franck
Oui, il y a des limites de mémoire - bien qu'elles puissent changer. Vous ne devriez probablement pas utiliser la mémoire d'instance pour la mise en cache généralisée, mais c'est idéal pour les données de configuration. –
Ok merci, je vais garder cela à l'esprit. Avez-vous un pointeur sur la façon de construire le délai dont vous parliez? – Franck
Stockez-les dans un module. Vous pouvez aller simple, comme avoir un module config.py
avec, par exemple:
AMAZON_KEY = 'XXXX'
Ensuite, utilisez:
import config
service = my_amazon_service(config.AMAZON_KEY)
Ou ont un objet de configuration un peu plus sophistiqué qui vous permet d'avoir paramètres par défaut pour votre application, touches de configuration namespaced etc.
Si ses données sensibles, vous ne devriez pas le stocker dans le code source comme sera vérifié dans le contrôle de la source. Les mauvaises personnes (à l'intérieur ou à l'extérieur de votre organisation) peuvent le trouver là. De plus, votre environnement de développement utilise probablement différentes valeurs de configuration de votre environnement de production. Si ces valeurs sont stockées dans du code, vous devrez exécuter un code différent en développement et en production, ce qui est une mauvaise pratique.
Dans mes projets, je mets des données de configuration dans le magasin de données 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:
AMAZON_KEY = Settings.get('AMAZON_KEY')
S'il y a une valeur pour cette clé dans le magasin de données, vous l'aurez. 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!
Bien joué, fonctionne comme un charme, j'ai également ajouté une méthode de jeu !! –
quel type d'informations d'identification? – systempuntoout
@systempuntoout Par exemple, mes informations d'identification Amazon AWS pour accéder à S3 –
Si vous n'aimez pas vos informations d'identification simples sur votre code source, la seule façon de procéder est d'utiliser un modèle de configuration sur le magasin de données. y accéder avec [ConfigParser] (http://docs.python.org/library/configparser.html). – systempuntoout