2014-11-23 70 views
3

我在使用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,因爲它提供了查找解決方案所需的調試信息。

+1

你應該讓你的'UID'更獨特。對於一個全球唯一的ID來說'1'是一個可怕的選擇。 – Evert 2014-11-24 16:26:14

回答

2

首先,請嘗試從客戶端查看標題,以確保標題不會被破壞或丟失在某處。您可以使用curl --head,然後使用URL來查看同一臺計算機上的客戶端將收到的完整標題。 (如果您根據Cookie或代理信息更改行爲,則可能需要使用插件或該特定客戶端的開發人員工具查看標題信息。)

其次,您的UID在整個宇宙。那些UID可以在其他地方複製。一種常見的做法是append your own unique hostname to the UID以確保它們是唯一的。

最後,您沒有提及Google日曆和iCal中Feed的失敗方式。Feed是否被忽略,就好像它是空的?兩種情況都會產生錯誤嗎?或者顯示的項目沒有正確顯示?