2014-11-23 2 views
3

У меня возникли трудности с созданием допустимого потока iCal с использованием Django.iCal Подача через Django Не распознано

Проблема, с которой я столкнулся, заключается в том, что мой файл и поток iCal действительны. Я могу посетить URL-адрес потока, чтобы загрузить файл .ics и проверить его только, импортировать его в календарь iCalendar или Google Calendar просто отлично и т. Д. На самом деле, если я размещаю тот же файл .ics, что и статический файл на моем сервере Django, и подписаться на этот статический URL-адрес из Календаря Google, он также отлично работает. Однако, когда вы указываете Google Calendar 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 

Я использую 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). Помимо установки Content-Type в моем HttpResponse, есть ли что-то, что мне нужно делать в Apache, чтобы заставить читателей видеть это как поток? Я слышал о django-ical, и кажется, что это лишний объем накладных расходов на то, что я делаю, и, глядя на его код, он устанавливает ответ с заголовками так же, как я уже делаю.

Любое понимание было бы весьма полезным.

UPDATE

я неправильно понял UID, полагая, что это просто идентификатор для элементов в моей подачи. Однако это не решило проблему. Чтобы прояснить этот вопрос, при попытке получить доступ к моему календарю с помощью проверки подлинности канала iCal, iCalendar или Календаря Google, меня встретила ошибка «сбой проверки iCal», и размер календаря всегда приводил к 0 байтам.

Предложение Джерри для CURL URL-адреса было правильным. То, что я нашел, было немного смущающим, но я был настолько сосредоточен на имплантации кода, что я никогда не доходил до функции уровня Django. CURLing URL-адрес показал, что были возвращены 0 байтов, поскольку пользователь перенаправлялся на страницу/login. У меня на представлении был обработчик @login_required.

Большое спасибо за вашу помощь, я правильно пометил ваш ответ, Джерри, поскольку он предоставил отладку, мне нужно было найти решение.

+1

Вы должны сделать свой 'UID' немного более уникальным. '1' - это ужасный выбор для уникального глобального идентификатора. – Evert

ответ

2

Во-первых, попробуйте посмотреть на свои заголовки от клиента, чтобы убедиться, что заголовки нигде не пропали или не пропали. Вы можете использовать curl --head, а затем URL-адрес, чтобы увидеть полные заголовки, которые получит клиент на том же компьютере. (Если вы изменяете поведение на основе файлов cookie или агента, вы можете использовать подключаемый модуль или инструменты разработчика для этого конкретного клиента, чтобы просмотреть информацию заголовка.)

Во-вторых, ваши UID не уникальны во всех вселенная. Эти UID можно было дублировать в другом месте. Одна из распространенных практик - append your own unique hostname to the UID, чтобы убедиться, что они уникальны.

И, наконец, вы не указали, как фид выходит из строя в Календаре Google и в iCal.Является ли корм просто проигнорированным, как будто он пуст? Является ли ошибка в любом случае? Или элементы отображаются, но не отображаются правильно?