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})

Статті знаходяться в модулі знання і поділяються за розділами. Тому для формування повної адреси використовується дві змінні:

  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 р. 09: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>

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
AD

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

  • Результат:50бали,
  • Рейтинг балів-4
m
  • molni99
  • 26 жовтня 2024 р. 08:37

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

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

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

  • Результат:20бали,
  • Рейтинг балів-10
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 19:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 21:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 15:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 14:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 18:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 22:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 листопада 2024 р. 14:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject04 червня 2022 р. 10:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 жовтня 2024 р. 16:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Слідкуйте за нами в соціальних мережах