я сделал канал 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? Я что-то пропустил?
Я бы сказал, что это определенная ошибка в джанго. Когда я говорю «когда я его опубликовал», я не хочу, чтобы мой переводчик сказал: «В прошлый раз я его изменил». Я вижу, вы уже [сообщили об этом] (http://code.djangoproject.com/ticket/14656), поэтому я думаю, время покажет. – eternicode
Это не похоже на «недостающую» функцию. в Django 1.2 и 1.3 вы можете добавлять атрибуты в фид. Если я хорошо помню в 1.3, просто нужно добавить через метод item_extra_kwargs класса Feed. "return {'published': self.get_object(). created}", это также сработает для создания подкастов и других видов каналов со специальными элементами или атрибутами –
Это хорошая новость, но это не относится к тому, что Элемент 'atom: updated' злоупотребляется и что важный элемент' atom: published' вообще не используется из коробки. – Thomas