Пишем web-проекты: система "лайков" для Django на примере PythonDigest.ru

Словоблудие:

Python дайджест - это крупный русскоязычный агрегатор Python новостей с кучей ссылок. Больше 10 тысяч ссылок уже собрали. Но в таком море контента тяжело ориентироваться и постоянно в голове вопрос "Как показать пользователю только релевантную информацию?".

Одному нравится Django, другому ссылки на обработку данных, кому-то релизы! Да и хорошо бы начать создавать конспекты из этих ссылок.

И вот пришло в голову два варианта решения вечного вопроса.

  1. Метить каждую новость тегами и группировать новости по этим меткам

Способ очень хороший, но нужна автоматика чтобы расставила теги или армию читателей :)

Представьте, надо прочитать каждую новость, разобраться в ней, а затем расставить теги, указать категории. Если учесть, что каждую неделю проходит модерацию более 300 ссылок и надо хотя бы по 2 минуты на такую модерацию, то примерно 10 часов рабочего времени уйдет. А ведь еще есть 10.000 ссылок в архиве, которые тоже надо переработать.

Надо явно какой-то другой подход!

  1. Узнать у пользователя какие ссылки ему нравятся и предлагать такие же.

Что же, такой подход более реальный для интеграции с Python Дайджест (хотя и над первым работаем). Все-таки инструментов достаточно - Google аналитика, Яндекс метрика и счетчики позволяют смотреть как ведет пользователь себя на сайте, что кликает.

Еще хорошо бы узнать какие ссылки нравятся. Конечно, можно считать "раз кликает, значит нравится", но какая-то система лайков не помешает и дайджесту.

Жаль, что каждого читателя опросить не можем.

+1/-1 еще покажут насколько хре..хорошо работает модератор.

С этой целью было решено прикрутить какую-то систему лайков.

Что от такой системы надо? Да чтобы сохраняла +1/-1, время, может быть какой-то user_id. Но так как на сайте PythonДайджест нет пользователей, то user_id будет какой-то крайне анонимный.

"Все написано до нас"

На просторах github найдены два модуля:

Первый модуль это простой django app для голосования, а второй это view для отображения голосования.

django-secretballot предоставляет пару моделей, функций которые буквально в одну строчку превращают вашу обычную модель в волшебную

secretballot.enable_voting_on(<ваша модель>)

Эта функция добавляет в модель набор полей и функций для голосования.

Также модуль предоставляет вьюху для голосования и простой middleware, который на основе HTTP заголовка генерирует user_id

Модуль простой, можно почерпнуть знания о расширении функционала моделии

Так, теперь второй модуль - django-likes

Этот модуль предоставляет набор templatetags для отображения голосования, пару шаблонов. По сути, модуль прокидывает запросы через себя в django-secretballot и тот сохраняет их в БД.

Модули рабочие, разве что пришлось повозиться с AJAX на стороне django-secretballot - буквально пару строк поправить.

В итоге, лайки были интегрированы в дайджест. Пару примеров как это выглядит:

Рейтинг
Текущий рейтинг: 4,3


Комментарии

Python-конференция

Теги

notify, os, isinstance, encode, database, all, многопоточность, mail, срез, сборник, pytest, новый год, конкурентность, аргумент, pycon, gevent, GIL, интерпретатор, python проект, игры, замыкание, copy, функциональное программирование, pynotify, pypi, типы данных, csv, график, testing, поиск ошибок, автоматизация, ardruio, swagger, память, файл, pip, тест, web, статический анализ, dsl, syntax, отчет, список, ide, графика, notification, rest, pycallgraph, githook, generic, hook. webhook, история, asyncio, logging, инструмент, swig, click, crawler, while, aiohttp, clonedigger, оптимизация, трансдьюсер, matplotlib, Бизли, bottle, концепция, типизация, fuzzy-testing, урок, language, путь, nose, image, тестирование, консоль, vk, c, list, operator, pylint, print, практика, сравнение, functools, измерение, польза, selenium, сопроцедуры, генерация данных, БД, мастер класс, plotly, tests, bokeh, генерация, производительность, winapi, flask, typing, strip, lxml, grab, scandir, Qt, pycharm, проект, книга, dictwriter, coverage, html, фп, pypy, signal, стандартная библиотека, now, weakref, google, практика программирования, corotine, sqlalchemy, nameko, синтаксис, import, паттер, virtualenv, api, зеленый поток, timeit, контекст, бд, funcy, encoding, кэш, json, статистика, байт-код, unittest, кодировка, opencv, datetime, ооп, itertools, package, fp, mixin, python, assert, pyqt, утка, garbage collector, курс, frozenset, numpy, django-debug-toolbar, терминал, xpath, closure, type, дубликат, requirements, статическая типизация, PIL, работа, debug, быстродействие, plot, рейтинг, водяной знак, ip, python3, yield from, видео, test, fuzzy, curses, gitter, unicode, decode, cache, twitter, pep, вконтакте, операционная система, ОС, тесты, any, awesome, задача, последовательность, geoip, ошибки, генератор, hardcore, toolbar, Wx, qt, магия, doctest, железо, marshal, множество, сигнал, greenlet, слайс, future, db, время, admin, pyside, regex, module, slots, примесь, sys, email, action, requirementstxt, регулярные выражения, дубликат кода, одноплатный компьютер, scrapinghub, micropython, фича, mock, raspberry pi, foreign key, ссылка, django, нг, pickle, модуль, celery, справочник, импорт, лямбда, rpc, with, наука, jinja2, log, обработка текста, super, set, svg, матрица, pygame, fixture, docstring, fabric, декларативный язык, пакет, опыт, магическая переменная, regexp, Гвидо, slice, gui, база данных, vkcom, юникод, yattag, ospath, cython, unit, maxmind, матан, документация, анализатор, Tags, менеджер контекста, yield, учебник, real-time, слабая ссылка, IPython, браузер, xml, GUI, gc, channel, машинное обучение, zip, библиотека, ошибка, данные, оповещение, парсинг, изображение, CLI, tox, фильтр, R, feedly, cffi, http, таблицы, python2, gunicorn, стандарт, if, requests, rss, tkinter, time, mechanize, gensim, интерфейс, enum, визуализация, postgresql, web parsing, язык, исключение, архитектура, lstrip, parsing, путь до файла, copy paste, multiprocessing, rstrip, статический анализатор, lambda