在Django中发布ics feeds

3 投票
1 回答
2985 浏览
提问于 2025-04-16 01:33

我正在尝试使用 Django 和 vobject 发布一个 ICS 订阅源。作为测试,我定义了以下视图:

def ical(request, user_id=None):
    cal = vobject.iCalendar()
    cal.add('method').value = 'PUBLISH'
    cal.add('calscale').value = 'GREGORIAN'
    cal.add('x-wr-calname').value = 'TestCal28'
    cal.add('x-wr-timezone').value = 'Australia/Sydney'
    cal.add('x-wr-caldesc').value = ''
    vevent = cal.add('vevent')
    vevent.add('dtstart').value = datetime.now()
    vevent.add('dtend').value = datetime(2010, 7, 22)
    vevent.add('dtstamp').value = datetime.now()
    vevent.add('summary').value = "Test event"
    icalstream = cal.serialize()
    response = HttpResponse(icalstream, mimetype='text/calendar')
    response['Filename'] = 'filename.ics'
    response['Content-Disposition'] = 'attachment; filename=filename.ics'

如果你访问 rosters.davidmck.com/ical/,你应该能下载到一个名为 filename.ics 的文件,文件类型是 text/calendar。到这里为止,一切都很好。

BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
PRODID:-//PYVOBJECT//NONSGML Version 1//EN
BEGIN:VEVENT
UID:20100720T073356Z-26389@Rafiki
DTSTART:20100720T173356
DTEND:20100722T000000
DTSTAMP:20100720T173356
SUMMARY:Test event
END:VEVENT
X-WR-CALDESC:
X-WR-CALNAME:TestCal28
X-WR-TIMEZONE:Australia/Sydney
END:VCALENDAR

这个 ICS 文件看起来格式还不错:我试过的所有日历应用都能导入,包括手动上传到谷歌日历。如果你通过 URL 在雅虎上订阅它,似乎也没问题。但问题来了:谷歌日历就是无法作为订阅使用。如果你试图通过 URL 添加到谷歌日历,它会一直显示“从 URL 导入日历”,有时最后还会出现失败的提示。

更让人沮丧的是,如果我把这个 filename.ics 文件放到某个静态文件的存放位置(比如 http://rosters.davidmck.com/site_media/filename.ics),它依然无法使用

据我所知,这两个位置(静态和生成的)都是可以外部访问的。我还尝试把这个 ICS 文件上传到另一个网络服务器,那样似乎就能正常工作,所以我怀疑谷歌日历可能不喜欢我的服务器,真让我抓狂,我想不出原因。

1 个回答

4

我觉得这个可能解决不了你的问题(听起来像是服务器配置的问题),不过我建议你看看 django-cal,它可以用来生成你的信息流。它的工作方式和django.contrib的聚合信息流框架是一样的(也就是说,使用起来很顺手)。

撰写回答