Evgenii Legotckoi
20 сентября 2016 г. 23:20

Django - Урок 005. Добавление RSS ленты на сайт с Django

Пока статей ещё не много на новом сайте, добавлю-ка я RSS-ленту , благо, что Django имеет встроенный функционал для организации RSS-лент, как в обычном формате, так и в формате Atom. Но для начала ограничусь добавлением обычно ленты новостей, которая может быть подключена к сервису FeedBurner, а также найдена на сайте каким-нибудь RSS-Ридером. Я, например, использую QuiteRSS , который, к слову говоря, написан на Qt5.


Что требуется для организации RSS-ленты в минимальном варианте:

  1. Добавить ссылку на ленту в тело head -тега страницы;
  2. Написать представление, которое будет отвечать за подготовку ленты;
  3. Модифицировать модель, по объектам которой будет строиться лента новостей.

Добавление ссылки на RSS-ленту

Для начала добавим ссылку на RSS-Ленту в заголовок страницы. Зачем это нужно? - Это необходимо для того, чтобы RSS-ридеры могли без проблем обнаружить ленту при сканировании сайта. Если не указать ссылку, то пользователю придётся вручную искать вашу RSS-ленту.

  1. <head>
  2. ...
  3. <link rel="home" type="application/rss+xml" href="http://example.com/feed" />
  4. ...
  5. </head>
  6.  

В данном случае RSS-лента указана по адресу feed.

Реализация представления

Для реализации представления нам потребуется класс Feed, а также импортировать ту модель, по объектам которой будет строиться лента новостей. Естественно выбрана модель Article, про которую я уже рассказывал в статье по Модели, Шаблону и Представлению , которые используются на этом сайте.

  1. from django.contrib.syndication.views import Feed
  2. from knowledge.models import *
  3.  
  4.  
  5. class ArticlesFeed(Feed):
  6. title = "EVILEG - Практическое программирование"
  7. description = "Последние статьи сайта EVILEG о программировании и информационных технологиях"
  8. link = "/"
  9.  
  10. def items(self):
  11. return Article.objects.exclude(article_status=False).order_by('-article_date')[:10]
  12.  
  13. def item_title(self, item):
  14. return item.article_title
  15.  
  16. def item_description(self, item):
  17. return item.article_content[0:400] + "<p>Статья впервые появилась на <a href="\"https://evileg.com/ru\"">EVILEG " \
  18. "- Практическое программирование</a></p>"

Итак, для того, чтобы воспользоваться возможностями RSS-ленты, необходимо наследоваться от класса Feed. Переопределить поле title, которое будет названием вашего RSS-канала, переопределить поле description, которое является описание вашего RSS-канала, а также обязательно указать адрес канала, но поскольку у меня этим каналом является главная страница сайта, то в качестве ссылка указан слеш.

ВНИМАНИЕ: Если не указать ссылку хотя бы так, будут сыпаться ошибки, и ничего не заработает.

Метод items возвращает 10 последних статей, исключая те, которые имеют статус черновика.

Метод item_title соответственно подставляет название статьи.

Метод item_description подставляет описание статьи из поля article_content в модели. При этом в описание попадают первые 400 символов в статье и дополнительная подпись с обратной ссылкой на сайт. Обратная ссылка на сайт сделана, чтобы агрегаторы новостей, которые будут пастись на вашем сайте оставляли обратные ссылки на сайт у себя.

Модификация Модели Article

Ключевым моментом является то, что обязательно наличие метода get_absolute_url, который также используется представлением RSS-ленты. Данный метод возвращает абсолютный адрес страницы и без него также будут сыпаться ошибки.

Вот такой метод добавлен в модель Article.

  1. def get_absolute_url(self):
  2. return reverse('knowledge:article', kwargs={'section': self.article_section.section_url,
  3. 'article_id': self.id})

Статьи находятся в модуле knowledge и разделяются по разделам. Поэтому для формирования полного адреса используется две переменных:

  1. адрес раздела
  2. id статьи

URL шаблон выглядит следующим образом:

  1. url(r'^(?P[\w]+)/(?P<article_id>[0-9]+)/$', views.EArticleView.as_view(),

Добавление шаблона URL для RSS

И чтобы всё заработало, осталось добавить шаблон URL для RSS. У меня данный шаблон находится в модуле home , как и вся лента новостей, кроме модели статей. И выглядит данный шаблон следующим образом.

  1. from django.conf.urls import url
  2.  
  3. from . import views
  4.  
  5. urlpatterns = [
  6. url(r'^feed/$', views.ArticlesFeed()),
  7. ]

Для Django рекомендую VDS-сервера хостера Timeweb .

Вам это нравится? Поделитесь в социальных сетях!

Илья Чичак
  • 11 декабря 2018 г. 20:52

Тут мне тоже есть что сказать=)

Сами разрабы советуют импортировать следующим образом:

  1. from <application_name> import <module_name>

Стоит избегать

  1. from . import <module_name>

или

  1. from <application_name> import *

в первом случае некоторым IDE срывает крышу=) (а вообще это несколько опасно, особенно в случае с джангой - можно импортнуть не то и не оттуда)

а во втором может случиться коллизия, например в двух модулях есть классы с одним и тем же именем (ну мало ли). и вот не угадаешь, какой будет в итоге=)

Явное лучше неявного=)

Evgenii Legotckoi
  • 11 декабря 2018 г. 21:06

Что интересно, если написать так

  1. from <application_name>.<module_name> import <filename>

,то PyCharm сносит крышу, если разрабатываешь в рамках проекта приложение, которое подготавливается в качестве самостоятельного приложения, которое в дальнейшем можно будет устанавливать через pip . То есть если оно имеет структуру гит репозитория, как, например, evileg_core

PyCharm вообще не понимает, что происходит.
приходится писать так

  1. from .<module_name> import <filename>

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь