2010-09-23 4 views
14

Ich mache eine Google AppEngine-Anwendung und habe Zweifel, wo sollte ich (sensible) Konfigurationsdaten wie Anmeldeinformationen speichern.Was ist ein guter Ort zum Speichern der Konfiguration in Google AppEngine (Python)

Sollte ich eine einzige bigtable Entity für die Konfiguration erstellen, oder gibt es eine andere empfohlene Möglichkeit, es zu speichern.

+0

Welche Art von Anmeldeinformationen? – systempuntoout

+0

@systempuntoout Zum Beispiel meine Amazon AWS-Anmeldeinformationen für den Zugriff auf S3 –

+0

Wenn Sie Ihre einfachen Anmeldeinformationen in Ihrem Quellcode nicht mögen, können Sie nur ein Konfigurationsmodell im Datenspeicher verwenden. Andernfalls könnten Sie Ihre Einstellungen in einer .ini-Datei speichern Zugriff mit [ConfigParser] (http://docs.python.org/library/configparser.html). – systempuntoout

Antwort

17

Wenn Sie in Ihre Quelle einbetten können, können Sie das tun, aber wenn Sie es dynamisch konfigurierbar benötigen, ist der Datenspeicher die richtige Wahl. Sie können vermeiden, die Einstellungen für jede Anforderung abzurufen, indem Sie sie im lokalen Speicher zwischenspeichern. Hier ist eine Hilfsklasse für das:

Einfach Unterklasse dies mit was auch immer Konfigurationswerte Sie benötigen (oder ändern Sie die Klasse selbst). Da geladener Code zwischen den Anforderungen bestehen bleibt, müssen Sie nur einen Abruf pro App-Instanz durchführen. Wenn Sie jedoch die Konfiguration dynamisch aktualisieren möchten, empfiehlt es sich möglicherweise, ein Timeout zu erstellen.

Wenn Sie Sachen wollen für eine begrenzte Zeit zwischenzuspeichern, die beste Wahl einfach speichert den Zeitstempel, wenn Sie es geholt:

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

Sehr interessant, ich habe diese Technik noch nie zuvor gesehen.Normalerweise würde ich Memcache verwenden, um die Anzahl der Abrufe aus dem Datenspeicher zu minimieren, aber dies scheint noch schneller zu sein, solange die Instanz geladen wird. Irgendein Gedächtnislimit, das verhindern würde, zu viel zu verwenden? – Franck

+0

Ja, es gibt Speichergrenzen - obwohl sie sich ändern können. Sie sollten wahrscheinlich keinen Instanzspeicher für das generalisierte Caching verwenden, aber es ist ideal für Konfigurationsdaten. –

+1

Ok danke, das werde ich mir merken. Haben Sie einen Hinweis darauf, wie Sie das Timeout aufbauen, von dem Sie gesprochen haben? – Franck

10

Speichern Sie sie in einem Modul. Sie können einfach gehen, wie mit einem config.py Modul, sagt:

AMAZON_KEY = 'XXXX' 

verwenden Dann:

import config 
service = my_amazon_service(config.AMAZON_KEY) 

Oder ein etwas anspruchsvollere Config-Objekt, die Sie sinnvolle Standardwerte für Ihre Anwendung haben kann, Namespaced Config Keys usw.

4

Wenn es sensible Daten ist, sollten Sie speichern Sie es nicht, wie es im Quellcode wird in die Quellcodeverwaltung eingecheckt. Die falschen Leute (innerhalb oder außerhalb Ihrer Organisation) können es dort finden. Außerdem verwendet Ihre Entwicklungsumgebung wahrscheinlich andere Konfigurationswerte aus Ihrer Produktionsumgebung. Wenn diese Werte im Code gespeichert werden, müssen Sie in der Entwicklung und Produktion einen anderen Code ausführen, was eine unordentliche und schlechte Übung ist.

In meinen Projekten habe ich Konfigurationsdaten im Datenspeicher Verwendung dieser Klasse:

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 diesen Wert zu erhalten tun würde:

AMAZON_KEY = Settings.get('AMAZON_KEY') 

Wenn es ein Wert für das heißt Geben Sie den Datenspeicher ein, Sie werden es erhalten. 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!

+1

Gut gemacht, funktioniert wie ein Charme, fügte ich auch eine Set-Methode hinzu !! –