通过Django服务的iCal Feed无法识别

时间:2014-11-23 14:16:16

标签: python django apache icalendar

我在使用Django生成有效的iCal流时遇到了困难。

我遇到的问题是我的iCal文件和流有效。我可以访问流URL来下载.ics文件并仅对其进行验证,将其导入iCalendar或Google Calendar就好了。事实上,如果我在Django服务器上托管与静态文件相同的.ics文件并订阅对于来自Google日历的静态网址,它也可以正常使用。但是,在向Google日历提供Feed网址时,没有运气。

我在Stack Overflow和搜索Google时遇到了几个类似的问题,但是大多数问题都存在完全相反的问题(文件无法正常工作,流无效,或者流有时无效)。我从他们提供的示例代码中可以看出最好的,我做了一些非常相似的事情,但是我的提要不起作用,所以我必须遗漏一些东西。

以下是.ics文件的内容。

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Tester//Version 0.0.1//EN
BEGIN:VEVENT
SUMMARY:iCal Timed
DTSTART:20140408T202000Z
DTEND:20140408T202000Z
DTSTAMP:20141107T153835Z
UID:event_1
DESCRIPTION:iCal Comment
END:VEVENT
BEGIN:VEVENT
SUMMARY:iCal All Day
DTSTART;VALUE=DATE:20140408
DTEND;VALUE=DATE:20140409
DTSTAMP:20141107T153835Z
UID:1
DESCRIPTION:iCal Comment
END:VEVENT
END:VCALENDAR

我正在使用带有icalendar 3.8.3的Django 1.7,以下是用于生成源的代码。

def ical_feed(request):
    cal = icalendar.Calendar()
    cal.add('prodid', '-//Tester//Version 0.1.1//EN')
    cal.add('version', '2.0')

    for e in Event.events.filter(user_id=request.user.pk).iterator():
        event = icalendar.Event()
        event['uid'] = unicode(e.pk)
        ...
        cal.add_component(event)

    stream = cal.to_ical()

    response = HttpResponse(stream, content_type='text/calendar; charset=utf-8')
    response['Filename'] = request.user.username + '.ics'
    response['Content-Disposition'] = 'attachment; filename=' + request.user.username + '.ics'

    return response

这不重要,但Django是通过Apache 2.4.7(Ubuntu)提供的。除了在我的HttpResponse中设置Content-Type之外,我还需要在Apache中做些什么来让读者看到它作为流吗?我听说过django-ical,对于我正在做的事情来说,这似乎是一笔不必要的开销,并且看着它的代码,它设置了标题的响应,就像我已经做的那样

非常感谢任何见解。

更新

我误解了UID,认为我的Feed中的项目标识符很简单。但是,这并没有解决问题。为了进一步澄清这个问题,在尝试从iCal Feed验证器,iCalendar或Google日历访问我的日历时,我遇到了一个"失败的iCal验证"错误,日历的大小总是导致0个字节。

Jerry建议CURL网址正确。我发现有点令人尴尬,但我专注于代码实现,我从来没有走到Django视图级别的功能。 CURLing URL显示返回了0个字节,因为用户被重定向到/ login页面。我在视图上有@login_required装饰器。

非常感谢您的帮助,我将您的答案标记为正确,Jerry,因为它提供了我需要的调试以找到解决方案。

1 个答案:

答案 0 :(得分:2)

首先,尝试从客户端查看标题,以确保标题不会被破坏或丢失。您可以使用curl --head然后使用URL查看同一台计算机上的客户端将收到的完整标头。 (如果您要根据Cookie或代理信息更改行为,则可能需要使用该特定客户端的插件或开发人员工具来查看标头信息。)

其次,您的UID在整个Universe中并不是唯一的。那些UID可以在其他地方复制。一种常见做法是append your own unique hostname to the UID以确保它们是唯一的。

最后,您没有在Google日历和iCal中提及Feed的失败方式。是否简单地忽略了Feed,就好像它是空的一样?两种情况都会产生错误吗?或者项目是否显示但没有正确显示?