11 дек. 2009 г.

Django RSS для Яндекс новостей

Не секрет, что контриб syndication в django умеет делать RSS ленты, и делает это очень правильно. Но вот беда, Яндексу для его новостей нужны не просто RSS 2.0 ленты, а RSS 2.0 с добавлением тэга yandex:full-text, да ещё и в кодировке windows-1251.

Завелосипедить эту досадную оплошность можно следующим образом (естественно, не только им, но именно в споре рождается истина, так что жду комментарии):


# in urls:

   (r'^yandex.xml$''text.views.yandex_rss'),





# in views:



def yandex_rss(request):

    from news.models import New

    output = {

        'news': New.objects.filter(rubrics__pk=11).order_by('-published').select_related()[:15],

    }

    from django.template.loader import render_to_string

    rendered = render_to_string('yandex.html', output).encode('cp1251')

    return HttpResponse(rendered, mimetype='application/rss+xml; Charset=windows-1251')



# yandex.html:



<?xml version="1.0" encoding="windows-1251"?>

<rss version="2.0"

     xmlns="http://backend.userland.com/rss2"

     xmlns:yandex="http://news.yandex.ru">

    <channel>

        <title>вИшиме.ру</title>

        <link>http://vishime.ru/</link>

        <description>Последние новости с вИшиме.ру</description>

        <lastBuildDate>{% now "r" %}</lastBuildDate>

        <image>

            <url>http://vishime.ru/media/favicon.ico</url>

            <title>вИшиме.ру</title>

            <link>http://vishime.ru/</link>

        </image>

        {% for new in news %}

        <item>

            <title>{{ new.title }}</title>

            <link>http://vishime.ru{{ new.get_absolute_url }}</link>

            <description>{% if new.lead %}{{ new.lead|striptags|safe }}{% else %}{{ new.text.text|striptags|truncatewords:"20"|safe}}{% endif %}</description>

            <author>{% if new.author %}{{ new.author }}{% else %}вИшиме.ру{% endif %}</author>

            <category>{{ new.rubrics.get }}</category>

            <pubDate>{{ new.published|date:'r' }}</pubDate>

            <yandex:full-text>{{ new.text.text|striptags|safe }}</yandex:full-text>

        </item>

        {% endfor %}

    </channel>

</rss>


Пример с вИшиме.ру, но внимание (!), эту ленту ещё не приняли в яндекс новости, так что приведенные куски кода ничего не гарантируют.

Ещё раз, я понимаю, что нужно такие вещи писать по другому (раз уж есть syndication).

Отправить комментарий