У меня есть генератор каналов Atom для моего блога, который работает на AppEngine / Python.Я использую шаблонизатор Django 1.2 для создания канала.Мой шаблон выглядит так:
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"
xml:lang="en"
xml:base="http://www.example.org">
<id>urn:uuid:4FC292A4-C69C-4126-A9E5-4C65B6566E05</id>
<title>Adam Crossland's Blog</title>
<subtitle>opinions and rants on software and...things</subtitle>
<updated>{{ updated }}</updated>
<author>
<name>Adam Crossland</name>
<email>adam@adamcrossland.net</email>
</author>
<link href="http://blog.adamcrossland.net/" />
<link rel="self" href="http://blog.adamcrossland.net/home/feed" />
{% for each_post in posts %}{{ each_post.to_atom|safe }}
{% endfor %}
</feed>
Примечание: если вы используете что-либо из этого, вам нужно будет создать свой собственный uuid для входа в узел id .
Обновленный узел должен содержать время и дату последнего обновления содержимого канала в формате rfc 3339 .К счастью, в Python есть библиотека, которая позаботится об этом за вас.Отрывок из контроллера, который генерирует канал:
from rfc3339 import rfc3339
posts = Post.get_all_posts()
self.context['posts'] = posts
# Initially, we'll assume that there are no posts in the blog and provide
# an empty date.
self.context['updated'] = ""
if posts is not None and len(posts) > 0:
# But there are posts, so we will pick the most recent one to get a good
# value for updated.
self.context['updated'] = rfc3339(posts[0].updated(), utc=True)
response.content_type = "application/atom+xml"
Не беспокойтесь о вещах self.context['updated']
.Вот как моя структура предоставляет ярлык для установки переменных шаблона.Часть импорта заключается в том, что я кодирую дату, которую хочу использовать с функцией rfc3339
.Кроме того, я установил свойство content_type
объекта Response равным application/atom+xml
.
Единственный другой отсутствующий фрагмент - это то, что шаблон использует метод с именем to_atom
для превращения объекта Post
в Atom-форматированные данные:
def to_atom(self):
"Create an ATOM entry block to represent this Post."
from rfc3339 import rfc3339
url_for = self.url_for()
atom_out = "<entry>\n\t<title>%s</title>\n\t<link href=\"http://blog.adamcrossland.net/%s\" />\n\t<id>%s</id>\n\t<summary>%s</summary>\n\t<updated>%s</updated>\n </entry>" % (self.title, url_for, self.slug_text, self.summary_for(), rfc3339(self.updated(), utc=True))
return atom_out
Это все, что требуется, насколько я знаю, и этот код генерирует совершенно приятный и работающий канал для моего блога.Теперь, если вы действительно хотите использовать RSS вместо Atom, вам нужно изменить формат шаблона канала, шаблона Post и content_type, но я думаю, что это суть того, что вам нужно сделать, чтобы получить каналгенерируется из приложения AppEngine / Python.