缓存Google日历的数据

0 投票
2 回答
884 浏览
提问于 2025-04-16 13:41

我需要从谷歌日历中提取事件,以便在用Django搭建的网站上展示这些事件。我不太确定最好的方法是什么,但我觉得数据应该被缓存(我的网站/应用现在没有使用任何缓存)。

因为我不需要事件的存档,所以我想避免使用数据库。

这是我考虑的步骤:

  1. (0) 检查缓存的日历文件的年龄,如果太旧了:
  2. 从谷歌下载iCalendar(.ics)文件(我不确定是否应该使用ics,也许RSS/XML更好?)
  3. 用iCalendar解析这个文件(Python iCalendar库
  4. 生成/渲染新的HTML输出,这样可以作为静态文件包含在Django网站上展示

欢迎对改进这个过程或其中某些部分提出建议。

更新:我考虑过使用JavaScript,但如果API出现问题,数据就无法获取了。不过如果这被认为是可接受的解决方案,我会进一步研究一下。

2 个回答

2

我的做法是通过使用ajax请求和JavaScript版本的gdata客户端库来避免缓存。

“iCalendar”有什么功能是你用JavaScript无法实现的吗?(这是一个用来处理这类数据的Python模块吗?)

这种做法可以节省存储空间和处理时间,而且很可能让你的网站反应更快。

2

我同意@marr75的看法,你可以通过JavaScript来实现你想要的功能(可以看看谷歌的GCal API的JavaScript页面)。

一种解决方案是写一个自己的自定义管理命令,这个命令可以填充Django的低级缓存,然后在你的模板中使用这些变量。你还可以设置这个管理命令定期运行,比如用cron作业,这样数据就能保持最新。你不一定要缓存单个变量,也可以缓存一整块用iCalendar构建的HTML(我假设你指的是这个)。

如果你能多提供一些细节,我可以给出更有帮助的回答。另外,你可能还想看看Django的按视图缓存装饰器

编辑:一个例子可能看起来像这样:

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)

撰写回答