У меня есть генератор 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>[email protected]</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, чтобы пойти в ид узла.
Обновленный узел должен содержать время и дату последнего обновления содержимого фида в формате 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.
Мое предположение, вероятно, вам нужно установить правильный тип содержимого в заголовках ответов, чтобы браузер распознал его как RSS-канал. но сейчас я слишком ленив, чтобы посмотреть, какой тип контента должен дать вам официальный ответ. –