我的Django应用程序每天都会检索RSS提要。我想坚持在应用程序的某个地方最后更新Feed的时间。我只检索一个Feed,它永远不会成长为多个Feed。我怎样才能坚持上次更新的时间?
到目前为止我的想法
创建模型并向其添加日期时间字段。这似乎有点过分,因为它向数据库添加了另一个表,其中只有一行。除此之外,它是最明显和最直接的解决方案。
创建一个只存储键/值映射的设置对象。最后更新的日期只是该数据库中的行。这基本上是以前解决方案的通用版本。
使用dbsettings/django-values,它允许您在数据库中存储设置。最后更新的日期只是一个“设置”。
我缺少的任何其他想法?
答案 0 :(得分:6)
尽管数据库在任何给定的表中定期存储许多行,但只要没有(m)任何索引就会浪费空间,因此只有一行只有一行表并不是特别昂贵。实际上,大多数数据库创建许多单行表来实现某些功能,例如用于生成主键的单调序列。我鼓励你为此创建一个常规模型。
答案 1 :(得分:2)
文件系统 是“持久保存单个值”的正确技术。
在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()
但是如果你想“每天都运行命令”,例如凌晨5点,cron 是正确的工具:
0 5 * * * /path/to/manage.py runscript /path/to/retreive/script
当然,您仍然可以在retreive脚本末尾的文件中写入最后一个更新时间戳,并在其他地方使用它,如果这对您有意义的话。
总结引用肯汤普森:
我最富有成效的一天是 扔掉1000行代码。
答案 2 :(得分:1)
我过去使用的一个解决方案是使用Django的缓存功能。您将值设置为True
且过期时间为一天(在您的情况下。)如果未设置该值,则您将获取Feed,否则您将不执行任何操作。
您可以在此处查看我的解决方案:Importing your Flickr photos with Django
答案 3 :(得分:0)
如果您只需要用于缓存目的,为什么不将它存储在memcached中?
另一方面,如果您将此数据用于其他目的(例如在页面上显示,或进行一些计算等),那么我会将其存储在新模型中 - 在Django中,所有持久性都是建立在数据库之上,通过模型,我不会尝试使用其他“聪明”的解决方案。
答案 4 :(得分:0)
我在使用PHP时常常做的一件事就是将xml存储在某处,但插入了一个新标签来保存最新检索的时间戳。它不是很好,但它快速而简单。
答案 5 :(得分:0)
保持简单会导致将其存储在文件系统中的想法......为什么你不能这样做?例如,您可以在其中一个应用程序中拥有siteconfig
模块,其中包含这些类型的数据。这可以加载来自特定文件的数据,该文件可以是文本,JSON,ConfigParser,pickle或任何合适的格式。只需import siteconfig
某个地方,它就可以加载数据并使其可供您网站中的其他模块使用。您可以轻松地扩展它以保存具有多个设置的类似dict的对象(例如,如果您有多个源,但不希望只有2-3行的模型,您可以轻松地保持最后一个 - 检索由Feed网址键入的dict中每个Feed的时间。
答案 6 :(得分:0)
创建一个会话密钥,该密钥会永久存在,并在每次访问时更新Feed时间戳。