2010-11-10 6 views
3

я сделал канал Atom в Django, используя класс, который выглядит примерно так:Почему Django Atom1Feed использует атом: обновляется вместо атома: опубликован?

class AtomFeed(Feed): 

    feed_type = feedgenerator.Atom1Feed 

    # ... 

    def item_pubdate(self, post): 
     return datetime.datetime(post.date.year, post.date.month, post.date.day) 

Результирующий XML для элемента:

<entry> 
    <title>..</title> 
    <link href="..." rel="alternate"></link> 
    <updated>2010-10-18T00:00:00+02:00</updated> 
    <author><name>...</name></author> 
    <id>...</id> 
    <summary type="html">...</summary> 
</entry> 

Дело отметить здесь, что дата идет в элемент atom:updated, а не элемент atom:published.

RFC ясно подсказывает мне, что это не предназначено использование:

«Атом: обновленный» элемент является дата конструкция указывает на самый последний момент времени, когда запись или подача была изменена в издатель считает значительным. Поэтому не все модификации обязательно приводят к изменению атома: обновленное значение.

Принимая во внимание:

«Атом: опубликован» элемент является дата конструкт, указывающий момент времени, связанного с событием в начале жизненного цикла записи.

Это не просто теоретическая проблема. Например, Google Reader не использует элемент updated и использует дату, когда он впервые увидел этот элемент. В результате он не упорядочивает элементы должным образом при первом импорте фида.

код в Django отвечает за это:

django/utils/feedgenerator.py:331

if item['pubdate'] is not None: 
    handler.addQuickElement(u"updated", rfc3339_date(item['pubdate']).decode('utf-8')) 

Там кажется, нет никакого упоминания о published элемента.

Это ошибка в Django? Я неправильно понимаю Atom RFC? Я что-то пропустил?

+0

Я бы сказал, что это определенная ошибка в джанго. Когда я говорю «когда я его опубликовал», я не хочу, чтобы мой переводчик сказал: «В прошлый раз я его изменил». Я вижу, вы уже [сообщили об этом] (http://code.djangoproject.com/ticket/14656), поэтому я думаю, время покажет. – eternicode

+0

Это не похоже на «недостающую» функцию. в Django 1.2 и 1.3 вы можете добавлять атрибуты в фид. Если я хорошо помню в 1.3, просто нужно добавить через метод item_extra_kwargs класса Feed. "return {'published': self.get_object(). created}", это также сработает для создания подкастов и других видов каналов со специальными элементами или атрибутами –

+0

Это хорошая новость, но это не относится к тому, что Элемент 'atom: updated' злоупотребляется и что важный элемент' atom: published' вообще не используется из коробки. – Thomas

ответ

0

Вы ничего не пропустили. Atom RFC корректен, и это известная ошибка в Django; см. this Django bug.

Похоже, что это относительно простое исправление, поэтому не стесняйтесь попасть туда и исправить его!^_^

+0

Хм ... теперь, когда я прочитал комментарии к вашему вопросу, каковы ставки, что вы тот, кто подал ошибку? ~ _ ~ – pythonian4000

+0

Да, это был я;) Он изменил статус на «принято», хотя и имеет хотя бы некоторую степень достоверности. – Thomas

+0

Ну, это то, что первые ответы переполнения стека - для того, чтобы сначала изучить весь вопрос! знак равно – pythonian4000

 Смежные вопросы

  • Нет связанных вопросов^_^