Целью домашнего задания является исследование технологии Comet и механизма кэширования данных.
Необходимо реализовать рассылку мгновенных сообщений о новых ответах всем пользователям, находящимся на странице определенного вопроса. Допустим есть два пользователя A и B. Оба находятся на странице одного вопроса, например /question/33. Пользователь A добавляет ответ на этот вопрос, пользователь B должен увидеть ответ без перезагрузки страницы.
Для этого необходимо:
- Настроить сервер Сentrifugo.
- На странице вопроса добавить JavaScript опрашивающий Сentrifugo сервер. В состав Сentrifugo входят JavaScript-библиотеки, их необходимо использовать для создания корректного соединения с сервером Сentrifugo по протоколу websocket.
- В форме добавления ответа добавить код, отправляющий сообщения в Сentrifugo, например с помощью библиотеки requests.
Необходимо подготовить и вывести данные для правой колонки (лучшие пользователи, популярные теги). Популярные теги - это 10 тегов с самым большим количеством вопросов за последние 3 месяца. Лучшие пользователи - это 10 пользователей задавших самые популярные вопросы или давших самые популярные ответы за последнюю неделю.
Так как запросы на предполагаются тяжелыми, необходимо кэшировать данные на диске или memcached. Вьюшки не должны запускать эти запросы, а только брать данные из кэша. Для кэширования можно использовать встроенные механизмы Django.
Так как данные необходимы на каждой страницы, их придется загружать в каждой вьюшке, либо можно расширить шаблонизатор своими (inclusion) тегами. Наполнять кэш данными необходимо с помощью Management команды, запускаемой из Cron.
Необходимо реализовать поиск по заголовкам и содержимому вопросов. Пользователь вводит текст в поисковой строке, которая находиться в шапке. По введенному тексту СУБД должна находить совпадения, используя полнотекстовые индексы. Результаты поиска отображаются пользователю в виде поисковых подсказок (выпадающий список под поисковой строкой).
Запрос должен отправляться автоматически по мере ввода пользователем частей текста. Необходимо удостовериться, что мы не перегружаем сервер лишними запросами, отправляя запрос на каждый новый введенный символ во время печати.
Real-time сообщения - 8:
- настройка сервера Centrifugo - 3;
- подключение клиентской части для работы с Сentrifugo - 3;
- отправка новых ответов на вопрос через requests - 2.
Блок популярные теги - 4:
- правильный расчет тегов - 2;
- предварительный расчет по cron - 2 (просто кеширование - 1).
Блок лучшие пользователи - 4:
- правильный расчет пользователей - 2;
- предварительный расчет по cron - 2 (просто кеширование - 1).
Поиск по заголовку и содержимому вопроса - 4:
- корректная работа поиска - 1;
- поисковые подсказки - 1;
- отправка данных на сервер по мере ввода - 1;
- ожидание ввода всех символов пользователем - 1.
- Документация по Centrifugo: серверная часть и клиентская часть;
- Библиотека requests для Python;
- Inclusion tags в Django;
- Настройка кэширования в Django;
- Использование кэшей в Django;
- Полнотекстовый поиск в MySQL;
- Cron.