2011-03-14 147 views
0

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

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

这是我考虑的办法:

  1. (0)检查缓存日历文件的年龄,如果太旧:
  2. 下载的iCalendar(的.ics)从谷歌文件(不知道我是否应该使用的IC,也许RSS/XML是更好吗?)用的iCalendar
  3. 解析文件(Python iCalendar lib
  4. 生成/渲染从日历新的输出HTML中可以作为静态文件和提出了关于Django的网站

对改进程序或部分程序的建议表示赞赏。

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

+1

只是一个问题,你怎么没有使用谷歌客户端库? – zsquare 2011-03-14 19:05:53

回答

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) 
+0

缓存html块是我想到的。这可以缓存在内存中,还是必须使用memcached或类似的? – vorpyg 2011-03-15 11:54:50

+1

您可以使用任何Django支持的[这里列出]的缓存(http://docs.djangoproject.com/en/dev/ref/settings/#std:setting-CACHES)。确保你阅读了你正在使用的Django版本的文档,因为最近这已经改变了。 – 2011-03-15 12:12:56

+1

我也编辑了我的答案,以便它为您提供一个示例。 – 2011-03-15 12:18:08

1

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

是否有“iCalendar”(这是一个用于操作这种数据的Python模块?)的功能,你不能使用JavaScript复制?

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

+1

....但是,如果谷歌日历由于任何原因不可用,该网站将无法正常工作。 – jMyles 2011-03-14 20:19:01

+0

应该可以对JS进行同样的操作,但是如果API无法访问,我认为在本地缓存数据会更安全。 – vorpyg 2011-03-15 11:53:11

+0

那么,虽然我确实意识到gdata API已经停机,但您是否预期(或需要)比谷歌的API更好的可用性?如果是这样,你可以回退到最近的副本。 – marr75 2011-03-16 21:11:09