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

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

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


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

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

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

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

<head>
...
<link rel="home" type="application/rss+xml" href="http://example.com/feed" />
...
</head>

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

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

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

from django.contrib.syndication.views import Feed
from knowledge.models import *


class ArticlesFeed(Feed):
    title = "EVILEG - Практическое программирование"
    description = "Последние статьи сайта EVILEG о программировании и информационных технологиях"
    link = "/"

    def items(self):
        return Article.objects.exclude(article_status=False).order_by('-article_date')[:10]

    def item_title(self, item):
        return item.article_title

    def item_description(self, item):
        return item.article_content[0:400] + "<p>Статья впервые появилась на <a href="\"https://evileg.com/ru\"">EVILEG " \
                                "- Практическое программирование</a></p>"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^feed/$', views.ArticlesFeed()),
]

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

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

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

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

from <application_name> import <module_name>

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

from . import <module_name>

или

from <application_name> import *

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

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

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

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

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

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

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

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

from .<module_name> import <filename>

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
m
  • moreSpb
  • 18 марта 2024 г. 15:32

C++ - Тест 003. Условия и циклы

  • Результат:85баллов,
  • Очки рейтинга6
в

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
l

C++ - Тест 005. Структуры и Классы

  • Результат:91баллов,
  • Очки рейтинга8
Последние комментарии
k
kmssr8 февраля 2024 г. 18:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 1:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 10:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 8:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik18 декабря 2023 г. 21:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
P
Pisych27 февраля 2023 г. 4:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 января 2024 г. 11:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
BlinCT
BlinCT27 декабря 2023 г. 8:57
Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
Дмитрий
Дмитрий10 января 2024 г. 4:18
Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
Evgenii Legotckoi
Evgenii Legotckoi12 декабря 2023 г. 6:48
Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

Следите за нами в социальных сетях