Как мне сохранить одно значение в Django? - PullRequest
5 голосов
/ 10 июля 2009

Мое приложение Django получает RSS-канал каждый день. Я хотел бы сохранить время последнего обновления канала где-то в приложении. Я получаю только один канал, и он никогда не превратится в несколько каналов. Как мне сохранить последнее обновленное время?

Мои идеи пока

  1. Создайте модель и добавьте в нее поле даты и времени. Это кажется излишним, поскольку добавляет в базу данных еще одну таблицу, в которой всегда будет только одна строка. Кроме этого, это наиболее очевидное и простое решение.

  2. Создать объект настроек, который просто хранит сопоставления ключ / значение. Дата последнего обновления будет просто строкой в ​​этой базе данных. По сути, это общая версия предыдущего решения.

  3. Используйте dbsettings / django-values ​​, что позволяет сохранять настройки в базе данных. Дата последнего обновления будет просто «установкой».

Есть еще идеи, которые мне не хватает?

Ответы [ 7 ]

6 голосов
/ 10 июля 2009

Несмотря на то, что базы данных фактов регулярно хранят много строк в любой данной таблице, иметь таблицу с одной строкой не особенно дорого, если у вас нет (m) индексов, которые бы тратили пространство. Фактически, большинство баз данных создают много таблиц в одну строку для реализации некоторых функций, таких как монотонные последовательности, используемые для генерации первичных ключей. Я призываю вас создать для этого обычную модель.

2 голосов
/ 10 июля 2009
  1. ОЗУ энергозависимо , поэтому не постоянное: memcached - это не то, что вы просили.
  2. XML это не правильная технология для хранения одного значения.
  3. RDMS не правильная технология для хранения одного значения.
  4. Платформа кеширования Django ответит на ваш вопрос, если для CACHE_BACKEND установлено значение, отличное от file: //...

Файловая система является подходящей технологией для "сохранения одного значения".

В settings.py:

 RSS_FETCH_DATETIME_PATH=os.path.join(
     os.path.abspath(os.path.dirname(__file__)),
     'rss_fetch_datetime'
 )

В вашем скрипте rss fetch:

 from django.conf import settings
 handler = open(RSS_FETCH_DATETIME_PATH, 'w+')
 handler.write(int(time.time()))
 handler.close()

Где вам нужно это прочитать:

 from django.conf import settings
 handler = open(RSS_FETCH_DATETIME_PATH, 'r+')
 timestamp = int(handler.read())
 handler.close()

Но cron - это правильный инструмент, если вы хотите «запускать команду каждый день», например, в 5 часов утра:

.
 0 5 * * * /path/to/manage.py runscript /path/to/retreive/script

Конечно, вы все равно можете записать отметку времени последнего обновления в файл в конце сценария получения и использовать ее где-нибудь еще, если это имеет смысл для вас.

В заключение, цитируя Кена Томпсона:

Один из моих самых продуктивных дней был выбрасывая 1000 строк кода.

1 голос
/ 10 июля 2009

Одним из решений, которое я использовал в прошлом, было использование функции кэширования в Django. Вы устанавливаете значение на True со сроком действия в один день (в вашем случае.) Если значение не установлено, вы выбираете канал, иначе вы ничего не делаете.

Мое решение вы можете увидеть здесь: Импорт фотографий Flickr с помощью Django

0 голосов
/ 10 июля 2009

Создайте ключ сеанса, который сохраняется вечно, и обновляйте метку времени канала при каждом обращении к нему.

0 голосов
/ 10 июля 2009

Сохранение этого просто привело бы к идее просто сохранить его в файловой системе ... почему вы не можете сделать это? Например, в одном из ваших приложений может быть модуль siteconfig, в котором хранятся данные такого рода. Это может загрузить данные из определенного файла, который может быть текстом, JSON, ConfigParser, Pickle или любым другим подходящим форматом. Просто import siteconfig где-нибудь, и он может загрузить данные и сделать их доступными для других модулей на вашем сайте. Вы могли бы легко расширить это, чтобы держать подобный диктату объект с рядом настроек (например, если у вас когда-либо есть несколько каналов, но вы не хотите иметь модель только для 2-3 строк, вы можете легко удерживать последнюю извлекается время для каждого канала в диктовке с указанием URL канала).

0 голосов
/ 10 июля 2009

Одна вещь, которую я использовал, когда занимался разработкой PHP, заключалась в том, чтобы где-то хранить xml, но с новым тегом, вставленным для хранения метки времени последнего поиска. Это не было здорово, но это было быстро и просто.

0 голосов
/ 10 июля 2009

Если вам это нужно только для целей кэширования, почему бы не сохранить его в memcached?

С другой стороны, если вы используете эти данные для других целей (например, отобразите их на странице, или сделаете некоторые вычисления и т. Д.), Я сохраню их в новой модели - в Django все постоянство построен на базе базы данных, с помощью моделей, и я бы не стал использовать другие «умные» решения.

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