Frage

Ich programmiere eine Website, in dem Benutzer eine Reihe von Einstellungen, wie die Wahl der Farbgebung hat, etc. Ich bin glücklich, diese als reine Textdateien zu speichern, und die Sicherheit ist kein Thema.

So wie ich es zur Zeit zu sehen ist: ein Wörterbuch, in dem alle Tasten sind Benutzer und die Werte sind Wörterbücher mit den Benutzereinstellungen in ihnen

.

Zum Beispiel userdb [ "bob"] [ "colour_scheme"] würde den Wert "blau".

Was ist der beste Weg, um es auf Datei zu speichern? Abbeizen das Wörterbuch?

Gibt es bessere Möglichkeiten zu tun, was ich tun möchte?

War es hilfreich?

Lösung

Mit cPickle auf dem Wörterbuch würde mein sein Wahl. Wörterbücher sind eine natürliche Ergänzung für diese Art von Daten, so dass angesichts Ihren Anforderungen Ich sehe keinen Grund, sie nicht zu verwenden. Das, es sei denn, Sie denken über sie aus nicht-Python-Anwendungen zu lesen, in dem Fall, dass Sie würde eine Sprache neutral Textformat verwenden. Und auch hier konnte man mit der Gurke und ein Exportwerkzeug weg.

Andere Tipps

Ich würde verwendet das ConfigParser -Modul, das produziert einige ziemlich lesbar und benutzerdefinierbare Ausgang für Ihr Beispiel:

[bob]
colour_scheme: blue
british: yes
[joe]
color_scheme: that's 'color', silly!
british: no

Der folgende Code würde die Config-Datei oben, produzieren und sie dann ausdrucken:

import sys
from ConfigParser import *

c = ConfigParser()

c.add_section("bob")
c.set("bob", "colour_scheme", "blue")
c.set("bob", "british", str(True))

c.add_section("joe")
c.set("joe", "color_scheme", "that's 'color', silly!")
c.set("joe", "british", str(False))

c.write(sys.stdout)  # this outputs the configuration to stdout
                     # you could put a file-handle here instead

for section in c.sections(): # this is how you read the options back in
    print section
    for option in c.options(section):
            print "\t", option, "=", c.get(section, option)

print c.get("bob", "british") # To access the "british" attribute for bob directly

Beachten Sie, dass ConfigParser nur Strings unterstützt, so dass Sie konvertieren, wie ich für die Boolesche oben haben. Siehe effbot für einen guten heruntergekommenen der Grundlagen.

I bekämpfen nicht die Frage, die man am besten ist. Wenn Sie Text-Dateien verarbeiten wollen, würde ich prüfen ConfigParser - Modul . Eine weitere Sie könnte einen Versuch geben würde simplejson oder yaml . Sie könnten auch eine reale Tabelle db berücksichtigen.

Zum Beispiel könnten Sie eine Tabelle userattrs genannt haben, mit drei Spalten:

  • Int User_id
  • String attribute_name
  • String attribute_value

Wenn es nur wenige gibt, können Sie sie in Cookies für den schnellen Abruf speichern können.

Hier ist der einfachste Weg. Verwenden Sie einfache Variablen und import die Einstellungsdatei.

Rufen Sie die Datei userprefs.py

# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )

In Ihrer Anwendung müssen Sie sicher sein, dass Sie diese Datei importieren können. Sie haben viele Auswahl.

  1. Mit PYTHONPATH. Erfordern PYTHONPATH eingestellt werden, um das Verzeichnis mit den Einstellungsdateien enthalten.

    a. Ein expliziter Befehlszeilenparameter die Datei (nicht die besten, aber einfach)

    zu nennen

    b. Eine Umgebungsvariable, die Datei zu nennen.

  2. sys.path Erweiterung des Benutzers Home-Verzeichnis enthält

Beispiel

import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs 
print userprefs.color

Für eine Datenbank-gestützte Website, natürlich, die beste Option ist eine Tabelle db. Ich gehe davon aus, dass Sie die Datenbank nicht, was tun.

Wenn Sie nicht über den Menschen lesbaren Formate ist es egal, dann ist pickle eine einfache und unkomplizierte Weise zu gehen. Ich habe auch gute Berichte über simplejson gehört.

Wenn die menschliche Lesbarkeit wichtig ist, zwei einfache Möglichkeiten stellen sich vor:

Modul: Nur ein Modul verwenden. Wenn alles, was Sie brauchen ein paar Globals und nichts Besonderes sind, dann ist dies der Weg zu gehen. Wenn Sie wirklich verzweifelt bekam, konnte man Klassen und Klassenvariablen definieren Abschnitte zu emulieren. Der Nachteil hier:., Wenn die Datei von einem Benutzer von Hand bearbeitet wird, könnten Fehler hart sein und Debug zu fangen

INI-Format: Ich habe mit ConfigObj für diese, 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, ein Sicherheitsnetz (und wichtige Fehlerrückmeldung) für Benutzer / Administratoren bereitstellt.

Ich würde verwenden shelve oder < a href = "http://www.python.org/doc/2.5.2/lib/module-sqlite3.html" rel = "nofollow noreferrer"> sQLite Datenbank, wenn ich würde diese Einstellung auf speichern das Dateisystem. Obwohl, da Sie eine Website bauen Sie wahrscheinlich eine Art von Datenbank verwenden, also warum nicht nur das benutzen?

Die eingebaute in sqlite3 Modul würde viel einfacher sein, wahrscheinlich als die meisten Alternativen, und bringt Sie bereit zu einem vollständigen RDBMS zu aktualisieren, sollten Sie sich nur wünschen oder benötigen.

Wenn die menschliche Lesbarkeit des von configfiles zählt Eine Alternative könnte sein der ConfigParser Modul , die ermöglicht es Ihnen, wie Dateien zu lesen und schreiben ini. Aber dann werden Sie auf eine Verschachtelungsebene beschränkt.

Wenn Sie eine Datenbank haben, könnte ich vorschlagen, die Einstellungen in der Datenbank zu speichern. Allerdings klingt es wie normale Dateien könnte Ihre Umgebung besser gerecht wird.

Sie wollen wahrscheinlich nicht speichern alle die Benutzer-Einstellungen in der gleichen Datei, da Sie in Schwierigkeiten mit den gleichzeitigen Zugriff auf diese eine Datei ausführen könnten. Wenn Sie für jeden Benutzer-Einstellungen als Wörterbuch in ihrer eigenen gebeizt Datei gespeichert, dann würden sie in der Lage sein, selbständig zu handeln.

Abbeizen ist eine vernünftige Möglichkeit, solche Daten zu speichern, aber leider ist die Beize Datenformat ist bekanntlich nicht-lesbare Form. Sie könnten besser dran als repr(dictionary) zu speichern, die ein besser lesbares Format sein werden. Um die Benutzereinstellungen neu zu laden, verwenden eval(open("file").read()) oder so ähnlich.

Ist es besonderen Grund Sie nicht die Datenbank für diese Verwendung? es scheint, die normal und natürlich, was zu tun -. oder speichern Sie eine Gurke von den Einstellungen in der db auf Benutzer-ID oder etwas verkeilt

Sie haben nicht die Nutzungsmuster der Website beschrieben, sondern nur eine allgemeinen Website zu denken - aber ich würde denken, dass die Einstellungen in einer Datenbank zu halten verursachen würde viel weniger Disk-I / O als Dateien mit

.

OTOH, für Einstellungen, die von clientseitigen Code verwendet werden könnten, so dass sie als Javascript in einer statischen Datei zu speichern, die wären praktisch zwischengespeichert werden können - auf Kosten mehrere Orte, die Sie Einstellungen haben könnten. (Ich würde wahrscheinlich diese Einstellungen in der DB speichern und wieder aufzubauen, die statischen Dateien wie erforderlich)

Ich bin mit der Antwort über die Verwendung von Essig eingelegte Wörterbuch. Sehr einfach und effektiv für einfache Daten in einer Dictionary-Struktur zu speichern.

Wenn Sie kümmern sich nicht über die Möglichkeit, die Datei selbst zu bearbeiten, und wollen eine schnelle Art und Weise Python-Objekte zu beharren, gehen Sie mit Gurke . Wenn Sie die Datei tun mögen, von einem Menschen lesbar sein, oder lesbar durch eine andere App verwenden ConfigParser . Wenn Sie etwas komplexere benötigen, mit einer Art von Datenbank geht, sei es relationale ( sqlite ) oder objektorientierte ( Axiom , zodb ).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top