Хранить простые пользовательские настройки в Python
я программирую веб-сайт, в котором пользователи будут иметь ряд настроек, таких как выбор цветовой гаммы, и т. д. Я рад хранить их как текстовые файлы, и безопасность не является проблемой.
то, как я это вижу в настоящее время: есть словарь, где все ключи являются пользователями, а значения-словари с настройками пользователей в них.
например, userdb ["bob"] ["colour_scheme"] будет иметь значение"синий".
Что самое лучшее способ сохранить его в файл? Мариновать словарь?
есть ли лучшие способы сделать то, что я пытаюсь сделать?
12 ответов
используя cPickle на словаре был бы мой выбор. Словари естественно подходят для такого рода данных, поэтому, учитывая ваши требования, я не вижу причин не использовать их. Это, если вы не думаете о чтении их из не-python приложений, в этом случае вам придется использовать нейтральный текстовый формат языка. И даже здесь вы можете уйти с рассолом плюс инструментом экспорта.
Я бы использовал 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 для хорошего беглого изложения основ.
Я не решаю вопрос, какой из них лучше. Если вы хотите обрабатывать текстовые файлы, я бы рассмотрел ConfigParser-module. Еще можно дать попробовать бы simplejson или в YAML. Вы также можете рассмотреть реальную таблицу db.
например, у вас может быть таблица userattrs с тремя столбцами:
- Int user_id
- строка имя_атрибута
- строка attribute_value
Если их всего несколько, вы можете сохранить их в куки для быстрого поиска.
вот самый простой способ. Используйте простые переменные и параметры.
вызов файла userprefs.py
# a user prefs file
color = 0x010203
font = "times new roman"
position = ( 12, 13 )
size = ( 640, 480 )
в вашем приложении, вы должны быть уверены, что вы можете импортировать этот файл. У вас есть много выбор.
-
используя
PYTHONPATH
. RequirePYTHONPATH
установите, чтобы включить каталог с файлами настроек.а. Явный параметр командной строки для имени файла (не лучший, но простой)
b. Переменная среды для имени файла.
расширения
sys.path
включить домашний каталог пользователя
пример
import sys
import os
sys.path.insert(0,os.path.expanduser("~"))
import userprefs
print userprefs.color
для веб-сайта, управляемого базой данных, конечно, лучшим вариантом является таблица БД. Я предполагаю, что вы не занимаетесь базой данных.
Если вы не заботитесь о удобочитаемых форматах, то pickle
Это простой и простой способ пойти. Я также слышал хорошие отчеты о simplejson
.
если человеческая читаемость важна, то 2 простых варианта представляют:
модуль: просто используйте модуль. Если все, что вам нужно, это несколько глобалов и ничего особенного, тогда это путь. Если вы действительно отчаялись, вы можете определить классы и переменные класса для эмуляции разделов. Недостатком здесь: Если файл будет вручную пользователем, ошибки могут быть трудно поймать и отладить.
формат INI: я использую статические библиотеки для этого, с небольшим успехом. ConfigObj по существу является заменой ConfigParser, с поддержкой вложенных разделов и многое другое. По желанию, вы можете определите ожидаемые типы или значения для файла и проверьте его, предоставив сетку безопасности (и важную обратную связь об ошибках) для пользователей/администраторов.
Если человека readablity из configfiles вопросам альтернативой может быть модуль ConfigParser что позволяет читать и писать .Ини файлы. Но тогда вы ограничены одним уровнем вложенности.
встроенный и sqlite3 модуль, вероятно, будет намного проще, чем большинство альтернатив, и вы будете готовы обновить до полной РСУБД, если вы когда-нибудь захотите или захотите.
Если у вас есть база данных, я мог бы предложить хранить настройки в базе данных. Тем не менее, похоже, что обычные файлы могут лучше соответствовать вашей среде.
вы, вероятно, не хотите хранить все настройки пользователей в том же файле, потому что вы можете столкнуться с проблемами с параллельным доступом к этому файлу. Если вы сохраните настройки каждого пользователя в виде словаря в их собственном маринованном файле, они смогут действовать независимо.
маринование разумный способ хранения таких данных, но, к сожалению, формат данных рассола, как известно, не читается человеком. Возможно, вам лучше хранить его как repr(dictionary)
который будет более читаемым форматом. Чтобы перезагрузить настройки пользователя, используйте eval(open("file").read())
или что-то подобное.
есть ли особая причина, по которой вы не используете базу данных для этого? это кажется нормальной и естественной вещью - или хранить рассол настроек в БД, набранных на id пользователя или что-то еще.
вы не описали шаблоны использования веб - сайта, но просто подумали об общем веб-сайте, но я бы подумал, что сохранение настроек в базе данных вызовет гораздо меньше ввода-вывода диска, чем использование файлов.
OTOH, для настроек, которые могут использоваться на стороне клиента код, хранящий их как javascript в статическом файле, который можно кэшировать, будет удобен-за счет наличия нескольких мест, где у вас могут быть настройки. (Я, вероятно, сохраню эти настройки в БД и перестрою статические файлы по мере необходимости)
Я согласен с ответом об использовании маринованного словаря. Очень простой и эффективный для хранения простых данных в структуре словаря.
Если вы не заботитесь о возможности редактировать файл самостоятельно и хотите быстрый способ сохранения объектов python, перейдите к огурец. Если вы хотите, чтобы файл читался человеком или каким-либо другим приложением, используйте ConfigParser. Если вам нужно что-то более сложное, перейдите к какой-то базе данных, будь то реляционная (SQLite в) или объектно-ориентированного (аксиомы, зодб).