2014-11-23 1 views
3

Django를 사용하여 유효한 iCal 스트림을 생성하는 데 문제가 있습니다.Django를 통해 제공되는 iCal 피드가 인식되지 않습니다.

내가 갖고있는 문제는 내 iCal 파일과 스트림이 유효하다는 것입니다. 스트림 URL을 방문하여 .ics 파일을 다운로드하여 유효성을 검사하고, iCalendar 또는 Google 캘린더로 가져올 수 있습니다. 사실, 장고 서버의 정적 파일과 동일한 .ics 파일을 호스트하고 구독하면 Google 캘린더의 정적 URL에도 제대로 작동합니다. 그러나 Google 캘린더에 피드 URL을 제공하면 운이 없게됩니다.

스택 오버플로 및 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 

나는 쟝션 1.7.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)을 통해 제공됩니다. Content-Type을 HttpResponse에 설정하는 것 외에 독자가 이것을 스트림으로보기 위해 아파치에서해야 할 일이 있습니까? 나는 장고 ical에 대해 들어 봤고, 내가하고있는 일에 대한 오버 헤드의 불필요한 양처럼 보였고, 코드를보고 나는 이미하고있는 것과 같은 방식으로 헤더로 응답을 설정했다.

어떤 통찰력이라도 대단히 감사하겠습니다.

UPDATE 나는 내 피드에서 항목에 대한 식별자 간단했다 생각 UID를 오해. 그러나 그 문제는 해결되지 않았습니다. 질문을 더 명확히하기 위해 iCal 피드 유효성 검사기, iCalendar 또는 Google 캘린더에서 내 캘린더에 액세스하려고 할 때 '실패한 iCal 인증'오류로 만났고 캘린더의 크기는 항상 0 바이트였습니다.

CURL에 대한 Jerry의 제안은 바로 적용됩니다. 내가 발견 한 것은 약간 당황스러운 것이었지만 코드 장의에 초점을 맞추어 장고 뷰 레벨 기능을 수행하지는 못했다. URL을 CURL하면 사용자가/login 페이지로 리디렉션 되었기 때문에 0 바이트가 반환 된 것으로 나타났습니다. 뷰에 @login_required 데코레이터가 있습니다.

대단히 고맙습니다. 솔루션을 찾을 필요가있는 디버깅을 제공 할 때 답변을 올바르게 표시했습니다. 제리.

+1

'UID'를 좀 더 고유하게 만들어야합니다. '1'은 전 세계적으로 고유 한 ID에 대한 끔찍한 선택입니다. – Evert

답변

2

먼저 클라이언트에서 헤더 을보고 헤더가 엉망이거나 어딘가에 있는지 확인하십시오. curl --head을 사용하고 URL을 사용하면 동일한 컴퓨터의 클라이언트가 수신하는 전체 헤더를 볼 수 있습니다. 쿠키 또는 에이전트 정보를 기반으로 동작을 변경하는 경우 해당 특정 클라이언트의 플러그인 또는 개발자 도구를 사용하여 헤더 정보를 볼 수 있습니다.

두 번째로 UID는 우주. 그 UID는 다른 곳에서 중복 될 수 있습니다. 한 가지 일반적인 방법은 append your own unique hostname to the UID이 고유한지 확인하는 것입니다.

마지막으로 Google 캘린더와 iCal에서 피드가 실패하는 방법에 대해서는 언급하지 않았습니다.피드가 비어있는 것처럼 무시됩니까? 두 경우 모두 오류가 발생합니까? 또는 항목이 나타나지만 올바르게 표시되지 않습니까?