我在使用Django生成有效的iCal流時遇到困難。通過Django提供的iCal Feed未被識別
我遇到的問題是我的iCal文件和流是有效的。我可以訪問流URL來下載.ics文件並僅對其進行驗證,將其導入iCalendar或Google Calendar等等。事實上,如果我將相同的.ics文件作爲靜態文件託管在我的Django服務器上並訂閱從谷歌日曆的靜態URL,它也工作得很好。但是,在爲Google日曆提供Feed網址時,沒有運氣。
我在堆棧溢出和搜索Google時發現了幾個類似的問題,但其中大多數都有完全相反的問題(文件不起作用,流有效,或只有流有效)。我可以從他們提供的示例代碼中看出最好的結果,我正在做一些非常類似的事情,但是我的Feed不起作用,所以我必須錯過一些東西。
這裏是.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
我正在使用Django 1.7和icalendar 3.8.3,下面是用於生成提要的代碼。
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,它看起來像是我在做的事情中不必要的開銷,並且看着它的代碼,它會像我已經做的那樣用頭設置響應。
任何瞭解將不勝感激。
UPDATE
我誤解了UID,以爲這是簡單的對我的飼料中的項目的標識符。但是,這並沒有解決問題。爲了進一步澄清這個問題,當試圖從iCal供稿驗證器,iCalendar或Google日曆訪問我的日曆時,遇到了「失敗的iCal驗證」錯誤,並且日曆的大小始終爲0字節。
傑裏的建議CURL URL是正確的。我發現有點尷尬,但我非常專注於代碼實現,所以我從來沒有一直走到Django視圖級功能。瀏覽URL顯示由於用戶被重定向到/登錄頁面而返回0字節。我在視圖上使用了@login_required裝飾器。
非常感謝您的幫助,我將您的答案標記爲正確,Jerry,因爲它提供了查找解決方案所需的調試信息。
你應該讓你的'UID'更獨特。對於一個全球唯一的ID來說'1'是一個可怕的選擇。 – Evert 2014-11-24 16:26:14