从Google日历缓存日历数据

时间:2011-03-14 18:49:56

标签: python django caching google-calendar-api icalendar

我需要从Google日历中提取事件,以便在使用Django构建的网站上展示它们。我不确定这样做的最佳方法是什么,但我相信应该缓存数据(我的网站/应用程序今天不使用任何缓存)。

因为我不需要事件存档,所以我想避免使用db。

这是我正在考虑的方法:

  1. (0)检查缓存日历文件的年龄,如果太旧:
  2. 从Google下载iCalendar(.ics)文件(不确定我是否应该使用ics。也许RSS / XML更好?)
  3. 使用iCalendar(Python iCalendar lib
  4. 解析文件
  5. 从日历生成/渲染新的html输出,可以作为静态文件包含在Django网站上
  6. 对于改进程序或部分程序的建议表示赞赏。

    更新:我考虑过使用JavaScript,但如果API关闭,数据将无法使用。但如果这被认为是一个可以接受的解决方案,我将不得不更多地考虑它。

2 个答案:

答案 0 :(得分:1)

我的方法是通过进行ajax调用和gdata客户端库的javascript版本来避免缓存。

是否有“iCalendar”的功能(这是一个用于操作此类数据的python模块吗?)你无法使用javascript进行复制?

这种方法可以节省存储和处理,并且很可能为您提供响应最快的网站。

答案 1 :(得分:1)

我同意@ marr75,因为你可以使用JavaScript实现你想做的事情(参见Google的JavaScript page for the GCal API)。

一种解决方案是编写自己的custom management command来填充Django的low level cache,然后在模板中使用这些变量。然后,您可以将此管理命令设置为定期运行作为cronjob以保持数据新鲜。您不必缓存单个变量 - 您可以始终缓存使用iCalendar构建的整个HTML块(我假设它是this)。

如果你详细了解它是什么,那么我可以给出一个比这更有帮助的答案。另外,您可能还想看看Django的per-view cache decorator

编辑:示例可能如下所示:

from django.core.cache import cache

# Generate HTML block to cache
html = '<div>Calendar</div>'

# Cache the HTML as 'google_calendar'
cache.set('google_calendar', html, 3600)

然后在您看来,您可以将缓存的HTML传回给它:

from django.shortcuts import render_to_response
from django.core.cache import cache

def home(request):
    data = {
        'gcal': cache.get('google_calendar')
    }
    return render_to_response('home.html', data)