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
  • molni99
  • 26 октября 2024 г. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

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

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

  • Результат:42баллов,
  • Очки рейтинга-8
Последние комментарии
i
innorwall9 ноября 2024 г. 6:03
Qt/C++ - Урок 009. QTimer или Как работать с таймером в Qt? She also saw an increase in her energy levels and improvement in her shortness of breath better business bureau online pharmacy priligy Transfection induced VEGFR2 promoter activity i…
i
innorwall9 ноября 2024 г. 5:36
Шаг 1: Настройка окружения для программирования на Python This fixed combination drug may be used as initial therapy or substituted for previously titrated doses of the individual components priligy side effects Expanded clinical phenotype o…
i
innorwall9 ноября 2024 г. 5:11
PyQt5 - Урок 003. QSystemTrayIcon - Как свернуть приложение в трей where can i buy priligy The medium was changed every three days
i
innorwall9 ноября 2024 г. 2:43
Релиз утилиты развертывания С++/Qt и QML приложений CQtDeployer v1.4.0 (Binary Box) can i buy priligy in usa Reprod Biomed Online 10 3 310 319
i
innorwall9 ноября 2024 г. 2:29
EVILEG - 4 Года онлайн buy priligy Pelleted food this way of administration is less stressful for the mice, and a few vendors offer a commercially available chow
Сейчас обсуждают на форуме
i
innorwall9 ноября 2024 г. 5:44
добавить qlineseries в функции We ve got the first batch ready for clinical trials, said Ovadje priligy usa LICENSED SHOP Nolvadex
9
9Anonim25 октября 2024 г. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
ИМ
Игорь Максимов3 октября 2024 г. 14:05
Реализация навигации по разделам Спасибо Евгений!
F
Fynjy22 июля 2024 г. 14:15
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …

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