Целью домашнего задания является исследование технологии Comet и механизма кэширования данных.
Необходимо реализовать рассылку мгновенных сообщений о новых ответах всем пользователям, находящимся на странице определенного вопроса. Допустим есть два пользователя A и B. Оба находятся на странице одного вопроса, например /question/33. Пользователь A добавляет ответ на этот вопрос, пользователь B должен увидеть ответ без перезагрузки страницы.
Для этого необходимо:
- Настроить nginx-push-stream-module в nginx (comet). Обратите внимание: этот модуль не относиться к стандартным. Nginx c этим модулем придется собирать самостоятельно.
- На странице вопроса добавить JavaScript опрашивающий comet сервер.
- В форме добавления ответа добавить код, отправляющий сообщения в comet, например с помощью библиотеки requests.
Необходимо подготовить и вывести данные для правой колонки (лучшие пользователи, популярные теги). Популярные теги - это 10 тегов с самым большим количеством вопросов за последние 3 месяца. Лучшие пользователи - это пользователи с самым большим количеством вопросов + ответов за последние 3 месяца.
Так как запросы на предполагаются тяжелыми, необходимо кэшировать данные на диске или memcached. Вьюшки не должны запускать эти запросы, а только брать данные из кэша. Для кэширования можно использовать встроенные механизмы Django.
Так как данные необходимы на каждой страницы, их придется загружать в каждой вьюшке, либо можно расширить шаблонизатор своими (inclusion) тегами. Наполнять кэш данными необходимо с помощью Management команды, запускаемой из Cron.
Необходимо реализовать поиск по заголовкам и содержимому вопросов. Пользователь вводит текст в поисковой строке, которая находиться в шапке. По введенному тексту СУБД должна находить совпадения, используя полнотекстовые индексы. Результаты поиска отображаются пользователю в виде поисковых подсказок (выпадающий список под поисковой строкой).
Запрос должен отправляться автоматически по мере ввода пользователем частей текста. Необходимо удостовериться, что мы не перегружаем сервер лишними запросами, отправляя запрос на каждый новый введенный символ во время печати.