Хранить простые пользовательские настройки в Python - PullRequest
7 голосов
/ 14 октября 2008

Я программирую веб-сайт, на котором у пользователей будет несколько настроек, таких как выбор цветовой схемы и т. Д. Я рад сохранить их в виде текстовых файлов, и безопасность не является проблемой.

В настоящее время я вижу это так: есть словарь, в котором все ключи - это пользователи, а значения - это словари с настройками пользователей в них.

Например, userdb ["bob"] ["colour_scheme"] будет иметь значение "blue".

Как лучше всего хранить его в файле? Травление словаря?

Есть ли лучшие способы делать то, что я пытаюсь сделать?

Ответы [ 12 ]

9 голосов
/ 15 октября 2008

Я бы использовал модуль ConfigParser , который выдает довольно читаемый и редактируемый пользователем вывод для вашего примера:

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

Следующий код создаст указанный выше файл конфигурации и распечатает его:

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

Обратите внимание, что ConfigParser поддерживает только строки, поэтому вам придется конвертировать, как я выше, для логических значений. См. effbot для ознакомления с основами.

7 голосов
/ 14 октября 2008

Использование cPickle в словаре будет моим выбором. Словари естественным образом подходят для такого рода данных, поэтому, учитывая ваши требования, я не вижу причин не использовать их. Это, если только вы не думаете о том, чтобы читать их из не-python-приложений, в этом случае вам придется использовать нейтральный для языка текстовый формат. И даже здесь вы можете получить удовольствие от рассола и инструмента для экспорта.

6 голосов
/ 14 октября 2008

Я не решаю вопрос, какой из них лучше. Если вы хотите обрабатывать текстовые файлы, я бы рассмотрел ConfigParser -module . Другой вариант, который вы могли бы попробовать, это simplejson или yaml . Вы также можете рассмотреть реальную таблицу БД.

Например, у вас может быть таблица с именем userattrs с тремя столбцами:

  • Int user_id
  • String attribute_name
  • String attribute_value

Если их всего несколько, вы можете сохранить их в куки для быстрого поиска.

4 голосов
/ 14 октября 2008

Вот самый простой способ. Используйте простые переменные и import файл настроек.

вызов файла userprefs.py

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

В вашем приложении вы должны быть уверены, что можете импортировать этот файл. У вас есть много вариантов.

  1. Использование PYTHONPATH. Требуется PYTHONPATH быть настроенным на включение каталога с файлами настроек.

    а. Явный параметр командной строки для имени файла (не самый лучший, но простой)

    б. Переменная среды для имени файла.

  2. Расширение sys.path для включения домашнего каталога пользователя

Пример

import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs 
print userprefs.color
3 голосов
/ 14 октября 2008

Конечно, для веб-сайта, управляемого базой данных, лучшим вариантом будет таблица db. Я предполагаю, что вы не занимаетесь базой данных.

Если вам не нужны читабельные форматы, то pickle - это простой и понятный способ. Я также слышал хорошие сообщения о simplejson.

Если важна читабельность для человека, появляются два простых варианта:

Модуль: Просто используйте модуль. Если все, что вам нужно, это несколько глобалов и ничего особенного, то это путь. Если вы действительно впали в отчаяние, вы можете определить классы и переменные класса для эмуляции разделов. Недостаток: если файл будет отредактирован пользователем вручную, ошибки могут быть трудно отловить и отладить.

Формат INI: Я использовал ConfigObj для этого, с небольшим успехом. ConfigObj по сути является заменой ConfigParser, с поддержкой вложенных разделов и многим другим. При желании вы можете определить ожидаемые типы или значения для файла и проверить его, предоставляя сеть безопасности (и важную информацию об ошибках) для пользователей / администраторов.

2 голосов
/ 15 октября 2008

Встроенный модуль sqlite3 , вероятно, будет гораздо проще, чем большинство альтернатив, и позволит вам подготовиться к обновлению до полной СУБД, если вы когда-либо захотите или захотите.

2 голосов
/ 14 октября 2008

Я бы использовал полку или sqlite базу данных, если бы мне пришлось хранить эти настройки в файловой системе. Хотя, поскольку вы создаете веб-сайт, вы, вероятно, используете какую-то базу данных, так почему бы просто не использовать это?

1 голос
/ 14 октября 2008

Если удобочитаемость конфигурационных файлов для человека важна, альтернативой может быть модуль ConfigParser , который позволяет читать и записывать файлы, подобные .ini. Но тогда вы ограничены одним уровнем вложенности.

0 голосов
/ 14 октября 2008

Если вам не нужна возможность редактировать файл самостоятельно, и вы хотите быстрый способ сохранения объектов Python, используйте pickle . Если вы хотите, чтобы файл был доступен для чтения человеку или для чтения другим приложением, используйте ConfigParser . Если вам нужно что-то более сложное, используйте какую-нибудь базу данных, будь то реляционная ( sqlite ) или объектно-ориентированная ( аксиома , zodb ).

0 голосов
/ 14 октября 2008

Я согласен с ответом об использовании маринованного словаря. Очень просто и эффективно для хранения простых данных в структуре словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...