|
Оглавление
|
Django поставляется со средствами высокого уровня для трансляции данных, что позволяет легко создавать потоки RSS или Atom.
Что такое RSS? Что такое Atom?RSS и Atom оба являются форматами, базирующимися на XML, которые вы можете использовать для рассылки автоматически обновляемого «содержания» для вашего сайта. Более подробно об RSS можно узнать на http://www.whatisrss.com/, об Atom — на http://www.atomenabled.org/. Здесь и далее мы будем использовать термин «трансляция» для английской фразы «syndication feed».
Для создания любой трансляции вам понадобится только написать короткий класс на языке Python. Вы можете создавать столько трансляций, сколько требуется. Средой высокого уровня для генерации трансляций является представление, которое по договорённости подключено к /feeds/. Django использует хвостовую часть URL (то, что идёт после /feeds/) для определения того, какую именно трансляцию следует вернуть.
Для создания трансляции, вам потребуется написать класс
Чтобы активировать трансляции на вашем сайте, добавьте следующее в файл привязок: (r'^feeds/(?P<url>.*)/$',
'django.contrib.syndication.views.feed',
{'feed_dict': feeds}
),
Этот код указывает Django, что следует использовать RSS среду для обработки всех URL, которые начинаются с feeds/. (Вы можете изменить этот префикс feeds/ на любой необходимый.)
Следует отметить, что параметр from django.conf.urls.defaults import *
from myproject.feeds import LatestEntries, LatestEntriesByCategory
feeds = {
'latest': LatestEntries,
'categories': LatestEntriesByCategory,
}
urlpatterns = patterns('',
# ...
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
{'feed_dict': feeds}),
# ...
)
Вышеприведённый пример регистрирует две трансляции:
Теперь надо определить сами классы
Класс
Вы должны подключать в код представления класс
django.contrib.syndication.feeds.Feed. Классы
Этот простой пример, взятый с http://chicagocrime.org/, описывает трансляцию, которая возвращает пять свежих новостей: from django.contrib.syndication.feeds import Feed
from chicagocrime.models import NewsItem
class LatestEntries(Feed):
title = "Chicagocrime.org site news"
link = "/sitenews/"
description = "Updates on changes and additions to chicagocrime.org."
def items(self):
return NewsItem.objects.order_by('-pub_date')[:5]
Отметим важные аспекты этого кода:
Надо сделать ещё кое-что. В RSS-потоке каждый элемент <item> имеет элементы <title>, <link> и <description>. Необходимо указать среде какие именно данные следует помещать в эти элементы.
Сайт http://chicagocrime.org предоставляет
RSS-потоки по последним преступлениям для каждого полицейского
участка в Чикаго. Можно устать, создавая классы
Вместо этого, среда трансляций позволяет вам создать базовые трансляции, которые возвращают элементы в зависимости от URL. На нашем сайте трансляции для полицейских участков доступны через URL, подобные этим:
Здесь сокращением является beats. Среда трансляций обнаруживает хвостовую часть URL после beats — 0613 и 1424 — и предоставляет вам возможность указать ей, что означает эта дополнительная часть URL и как она влияет на транслируемые данные. Пример должен всё прояснить. Ниже представлен код для таких трансляций: from django.core.exceptions import ObjectDoesNotExist
class BeatFeed(Feed):
def get_object(self, bits):
# In case of "/rss/beats/0613/foo/bar/baz/", or other such
# clutter, check that bits has only one member.
if len(bits) != 1:
raise ObjectDoesNotExist
return Beat.objects.get(beat__exact=bits[0])
def title(self, obj):
return "Chicagocrime.org: Crimes for beat %s" % obj.beat
def link(self, obj):
return obj.get_absolute_url()
def description(self, obj):
return "Crimes recently reported in police beat %s" % obj.beat
def items(self, obj):
crimes = Crime.objects.filter(beat__id__exact=obj.id)
return crimes.order_by('-crime_date')[:30]
Здесь представлен базовый алгоритм среды RSS-потоков. Берём данный класс и обрабатываем URL /rss/beats/0613/:
Полная документация по всем методам и атрибутам классов
По умолчанию среда трансляций генерирует RSS 2.0. Для
изменения этого поведения надо добавить атрибут
feed_type в ваш класс
from django.utils.feedgenerator import Atom1Feed
class MyFeed(Feed):
feed_type = Atom1Feed
Следует отметить то, что вы устанавливаете этот атрибут для класса, а не для экземпляра. Доступные типы трансляций показаны в таблице «Типы трансляций»: Таблица 11.1. Типы трансляций
Для того, чтобы указать вложения (т.е. медиа ресурсы ассоциированные с элементами трансляции, такими как MP3 подкасты), используйте обработчики item_enclosure_url, item_enclosure_length и item_enclosure_mime_type, например: from myproject.models import Song
class MyFeedWithEnclosures(Feed):
title = "Example feed with enclosures"
link = "/feeds/example-with-enclosures/"
def items(self):
return Song.objects.all()[:30]
def item_enclosure_url(self, item):
return item.song_url
def item_enclosure_length(self, item):
return item.song_length
item_enclosure_mime_type = "audio/mpeg"
Это предполагает, что вы уже создали объект
Трансляции создаваемые средой автоматически получают соответствующий тег <language> (RSS 2.0) или атрибут xml:lang (Atom). Значение этого тега зависит от параметра конфигурации LANGUAGE_CODE. Атрибут/метод link может возвращать как абсолютный URL (т.е. /blog/), так и полный URL (т.е. http://www.example.com/blog/). Если link не возвратил домен, то среда трансляций добавит домен текущего сайта в соответствии с параметром конфигурации SITE_ID. Трансляции Atom требуют наличия <link rel="self">, который определяет место расположения трансляции. Среда трансляций создаёт его автоматически, используя домен текущего сайта в соответствии с параметром конфигурации SITE_ID.
Некоторые разработчики предпочитают предоставлять трансляции в
обоих видах: RSS и Atom. С помощью Django это несложно
сделать: просто создайте подкласс для вашего класса
from django.contrib.syndication.feeds import Feed
from chicagocrime.models import NewsItem
from django.utils.feedgenerator import Atom1Feed
class RssSiteNewsFeed(Feed):
title = "Chicagocrime.org site news"
link = "/sitenews/"
description = "Updates on changes and additions to chicagocrime.org."
def items(self):
return NewsItem.objects.order_by('-pub_date')[:5]
class AtomSiteNewsFeed(RssSiteNewsFeed):
feed_type = Atom1Feed
А здесь соответствующий файл привязок: from django.conf.urls.defaults import *
from myproject.feeds import RssSiteNewsFeed, AtomSiteNewsFeed
feeds = {
'rss': RssSiteNewsFeed,
'atom': AtomSiteNewsFeed,
}
urlpatterns = patterns('',
# ...
(r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
{'feed_dict': feeds}),
# ...
)
|
Увидели ошибку?
Выделите её мышкой и нажмите
-
Обработано:
1049
49
130
71
Версия книги
1.0
2.0
Версия 2.0 в процессе перевода!
Мой луч
Многообразие света
Полезное
Актуальные вакансии,
Python работа
для python-разработчиков.
Скачать в формате
CHM от 2 сентябряЗаказать PDF файл можно через почту, чат, джаббер. Всего 2WMZ. Содержимое точно соответствует содержимому сайта. Чем чаще заказываете — тем больше перевожу. Русская группа
Ускорить процесс перевода!
R130494980980
Z425285133788 E112528079659 U327380922061 Книга помогла реализовать:
|
| © 2008-2009 Ruslan Popov @ gmail.com | Powered by Django 1.1 beta 1 SVN-11114 |