Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

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

Feed, RSS, Python

Пока статей ещё не много на новом сайте, добавлю-ка я 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 .

Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking

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

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

from <application_name> import <module_name>

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

from . import <module_name>

или

from <application_name> import *

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

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

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

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

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

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

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

from .<module_name> import <filename>

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
МБ
21 апреля 2019 г. 9:40
Моисей Бушуев

Qt - Тест 001. Сигналы и слоты

  • Результат:0баллов,
  • Очки рейтинга-10
AA
17 апреля 2019 г. 19:40
Anton Ablin

Qt - Тест 001. Сигналы и слоты

  • Результат:73баллов,
  • Очки рейтинга1
E
17 апреля 2019 г. 18:16
Evgeny

Qt - Тест 001. Сигналы и слоты

  • Результат:100баллов,
  • Очки рейтинга10
Последние комментарии
21 апреля 2019 г. 16:22
Евгений Легоцкой

Через метод setIcon table.horizontalHeaderItem(0).setIcon("qrc://path/to/icon.png")
21 апреля 2019 г. 15:48
Евгений Легоцкой

Добрый день! Спасибо за комментарий. Там действительно лучше будет сделать с инициализацией по умолчанию.
U
18 апреля 2019 г. 15:37
Unreal_man

А как иконку в хедер задать?
u
18 апреля 2019 г. 2:15
uaa

доброго времени,большое спасибо за пример для начинающего)при адаптации к своему проекту столкнулся с таким ньансом:в vepolyline.h в 47 строке нужна инициализация по умолчанию: int m_pointF...
E
11 апреля 2019 г. 12:49
Evgeny

Спасибо за ответ) У меня компоновщик на нее ругался просто. Оказалось, просто забыл Q_OBJECT в начале класса указать.
Сейчас обсуждают на форуме
23 апреля 2019 г. 18:39
BlinCT

Вопрос закрыт) проблема найдена
21 апреля 2019 г. 16:16
Евгений Легоцкой

Приветствую Нужно сохранять где-то выбранное значение, а потом восстанавливать его. Или использовать QSettings или добавить метод open(), в который передавать начальные значения для того...
R
19 апреля 2019 г. 9:55
RED_Spider

мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread
i
17 апреля 2019 г. 15:03
ilya.guzikov

BlinCT, на стороне ++ это делать необходимо так как в qml при использовании функции append происходит перерисовка всех точек лини(как я понимаю) и из-за этого при использовании больших массиво...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы