Ich programmiere eine Website, auf der die Benutzer eine Reihe von Einstellungen vornehmen können, z. B. die Wahl des Farbschemas usw. Ich bin froh, diese als reine Textdateien zu speichern, und Sicherheit ist kein Problem.
>So wie ich es momentan sehe: Es gibt ein Wörterbuch, in dem alle Schlüssel Benutzer sind und die Werte sind Wörterbücher mit den Benutzereinstellungen darin.
Zum Beispiel hätte userdb ["bob"] ["colour_scheme"] den Wert "blue".
Was ist der beste Weg, um es in der Datei zu speichern? Das Wörterbuch einbeißen?
Gibt es bessere Möglichkeiten, das zu tun, was ich versuche?
cPickle auf das Wörterbuch wäre meine Wahl. Wörterbücher sind eine natürliche Ergänzung für diese Art von Daten. Daher sehe ich keinen Grund, sie nicht zu verwenden. Wenn Sie nicht daran denken, sie aus Nicht-Python-Anwendungen zu lesen, müssen Sie ein sprachneutrales Textformat verwenden. Und selbst hier könntest du mit der Beize plus einem Exportwerkzeug davonkommen.
Ich würde das ConfigParser -Modul verwenden, das ziemlich gut lesbar ist und benutzerdefinierbare Ausgabe für Ihr Beispiel:
%Vor%Der folgende Code würde die obige Konfigurationsdatei erzeugen und dann ausdrucken:
%Vor%Beachten Sie, dass ConfigParser nur Zeichenfolgen unterstützt, also müssen Sie wie oben für die Booleans konvertieren. Siehe effbot für einen guten Überblick über die Grundlagen.
Ich beschäftige mich nicht mit der Frage, welcher der beste ist. Wenn Sie mit Textdateien arbeiten wollen, würde ich ConfigParser -module in Erwägung ziehen . Eine andere Möglichkeit wäre simplejson oder yaml . Sie könnten auch eine echte db-Tabelle betrachten.
Sie könnten beispielsweise eine Tabelle namens userattrs mit drei Spalten haben:
Wenn es nur wenige gibt, können Sie sie zum schnellen Abrufen in Cookies speichern.
Hier ist der einfachste Weg. Verwenden Sie einfache Variablen und import
die Einstellungsdatei.
Rufen Sie die Datei userprefs.py
auf %Vor%In Ihrer Anwendung müssen Sie sicher sein, dass Sie diese Datei importieren können. Sie haben viele Wahlmöglichkeiten.
Verwendung von PYTHONPATH
. Erfordert, dass PYTHONPATH
so eingestellt ist, dass das Verzeichnis mit den Einstellungsdateien enthalten ist.
a. Ein expliziter Befehlszeilenparameter zum Benennen der Datei (nicht der beste, aber einfache)
b. Eine Umgebungsvariable, um die Datei zu benennen.
Erweitern von sys.path
um das Home-Verzeichnis des Benutzers zu enthalten
Beispiel
%Vor%Für eine datenbankgestützte Website ist Ihre beste Option natürlich eine db-Tabelle. Ich gehe davon aus, dass Sie nicht die Datenbank-Sache machen.
Wenn Sie keine lesbaren Formate bevorzugen, ist pickle
ein einfacher und direkter Weg. Ich habe auch gute Berichte über simplejson
gehört.
Wenn die menschliche Lesbarkeit wichtig ist, gibt es zwei einfache Möglichkeiten:
Modul: Verwenden Sie einfach ein Modul. Wenn alles, was Sie brauchen, ein paar Globals und nichts Besonderes sind, dann ist dies der Weg zu gehen. Wenn Sie wirklich verzweifelt sind, können Sie Klassen und Klassenvariablen definieren, um Abschnitte zu emulieren. Der Nachteil hier: Wenn die Datei von einem Benutzer manuell bearbeitet wird, können Fehler schwer zu erfassen und zu debuggen sein.
INI-Format: Ich habe ConfigObj dafür verwendet. mit ziemlich viel Erfolg. ConfigObj ist im Wesentlichen ein Ersatz für ConfigParser, mit Unterstützung für verschachtelte Abschnitte und vieles mehr. Optional können Sie erwartete Typen oder Werte für eine Datei definieren und validieren, um ein Sicherheitsnetz (und wichtige Fehlerrückmeldungen) für Benutzer / Administratoren bereitzustellen.
Wenn die menschliche Lesbarkeit von configfiles eine Rolle spielt, könnte eine Alternative das ConfigParser-Modul sein, mit dem Sie das tun können Lese und schreibe .ini ähnliche Dateien. Aber dann sind Sie auf eine Verschachtelungsebene beschränkt.
Das eingebaute Modul sqlite3 wäre wahrscheinlich viel einfacher als die meisten anderen Alternativen, und macht Sie bereit, auf ein vollständiges RDBMS zu aktualisieren, sollten Sie jemals wollen oder müssen.
Wenn Sie eine Datenbank haben, empfehle ich Ihnen, die Einstellungen in der Datenbank zu speichern. Es klingt jedoch so, als würden gewöhnliche Dateien besser zu Ihrer Umgebung passen.
Wahrscheinlich möchten Sie nicht alle Benutzereinstellungen in derselben Datei speichern, da sonst Probleme beim gleichzeitigen Zugriff auf diese eine Datei auftreten können. Wenn Sie die Einstellungen jedes Benutzers als Wörterbuch in einer eigenen, gebeizten Datei speichern, können diese unabhängig voneinander arbeiten.
Das Abbeizen ist eine vernünftige Art, solche Daten zu speichern, aber leider ist das Datenformat der Beize notorisch nicht lesbar. Sie können es besser als repr(dictionary)
speichern, was ein besser lesbares Format ist. Um die Benutzereinstellungen neu zu laden, verwenden Sie eval(open("file").read())
oder etwas ähnliches.
Gibt es einen bestimmten Grund, warum Sie die Datenbank nicht dafür verwenden? es scheint die normale und natürliche Sache zu sein - oder eine Essiggurke der Einstellungen in der db zu speichern, die auf Benutzeridentifikation oder etwas eingekeilt wird.
Sie haben die Nutzungsmuster der Website nicht beschrieben, sondern nur an eine allgemeine Website gedacht - aber ich würde denken, dass das Speichern der Einstellungen in einer Datenbank viel weniger Festplatten-I / O als die Verwendung von Dateien verursachen würde.
OTOH, für Einstellungen, die von clientseitigem Code verwendet werden könnten, wäre es praktisch, sie als Javascript in einer statischen Datei zu speichern, die zwischengespeichert werden kann - auf Kosten von mehreren Orten haben Sie möglicherweise Einstellungen. (Ich würde diese Einstellungen wahrscheinlich in der Datenbank speichern und die statischen Dateien nach Bedarf neu erstellen)
Ich stimme der Antwort zur Verwendung von Pickled Dictionary zu. Sehr einfach und effektiv zum Speichern einfacher Daten in einer Dictionary-Struktur.
Wenn es Ihnen nicht wichtig ist, die Datei selbst bearbeiten zu können und einen schnellen Weg zu finden, um Python-Objekte zu erhalten, gehen Sie zu pickle . Wenn Sie möchten, dass die Datei für einen Menschen lesbar oder von einer anderen App lesbar ist, verwenden Sie KonfigParser . Wenn Sie etwas Komplexeres brauchen, gehen Sie mit einer Art Datenbank um, sei es relational ( sqlite ) oder objektorientiert ( Axiom , zodb ).