Django-way для создания ленты новостей/обновления статуса/потока активности

Я хотел бы создать многоразовое приложение Django, которое обрабатывает обновления статуса пользователей. Очень похоже на «ленту новостей» в Facebook.

Варианты использования включают, например:

  • Преподаватель может создать задание к определенной дате, и каждый студент может увидеть в ленте новостей, что задание было создано, с кратким описанием, датой, когда оно должно быть выполнено, и ссылкой для просмотра полного описания.
  • Он также может загрузить новый PDF-файл, который он находит интересным для своих учеников. В новостной ленте должна отображаться информация об этом, например, описание pdf, ссылка для скачивания и ссылка для предварительного просмотра.
  • Можно опубликовать ссылку на видео YouTube, и в ленте новостей отобразится небольшая миниатюра, а по щелчку видео встраивается с помощью javascript, и пользователь может смотреть это сразу.

Одна из проблем заключается в том, как обрабатывать различные виды обновлений и отображать для них правильный «html-фрагмент». Другая, более важная, заключается в том, как проектировать Модели этого «пути Джанго».

Что касается первого, я мог бы придумать два способа сделать это:

  1. Использование наследования модели;
  2. Использование общих отношений.

Я искал, прежде чем писать сюда, но ничего не нашел. Я проверил Pinax, чтобы узнать, реализовано ли оно у них, но это не так. Итак, я здесь ищу больше предложений о том, как справиться с этим красивым и не хакерским способом.

Заранее спасибо,


person Tiago    schedule 24.01.2010    source источник
comment
Посмотрите, как мы делаем шаблоны здесь: github.com/GetStream/stream-django#templating С помощью пользовательского тега шаблона все довольно просто.   -  person Thierry    schedule 10.10.2014


Ответы (4)


Я могу думать двумя способами:

Во-первых, возможно, вы могли бы создать каналы для своих моделей Assigments, PdfFiles , и Youtube link, и используйте библиотеку feedparser, чтобы встроить ее в свои представления новостей, это самый простой способ, потому что вы можете определить в шаблонах код для каждого вида новой деятельности.

Второе, о чем я могу думать, это создать класс Activity:

class Activity(models.Model):
    date = models.DateTimeField(auto_now_add = True)
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')

И через сигналы создайте новый экземпляр Activity каждый раз, когда у вас есть новое задание или загрузка в формате PDF или ссылка на YouTube, и для каждого класса создайте метод, например render_to_html, таким образом, по вашему мнению, вы можете сделать for over Activity и вызвать метод render_to_html

person diegueus9    schedule 24.01.2010
comment
Привет, Diegueus9! Спасибо за указание на структуру фида. Я видел ссылку на него в документах, но никогда не проверял. Что касается модели Activity, то это действительно лучший способ. - person Tiago; 25.01.2010
comment
Привет, Тиаго, с удовольствием, если вам нужна дополнительная помощь с инфраструктурой или сигналами ContentType, не сомневайтесь в контакте с mw. - person diegueus9; 25.01.2010
comment
Обе ссылки мертвы :/ - person Hankrecords; 06.10.2017

Python на самом деле является отличным языком для создания потоков активности и новостных лент. Томмазо и я написали пакет Stream Framework. https://github.com/tschellenbach/stream-framework В настоящее время это наиболее часто используемое решение Python для создания новостных лент. Мы также предлагаем размещенное решение по адресу https://getstream.io. С клиентом Django проще всего начать работу: https://github.com/GetStream/stream-django. и python можно найти здесь (https://github.com/getstream/stream-python)

Шаблонная часть работает так

{% load stream_django %}

{% for activity in activities %}
    {% render_activity activity %}
{% endfor %}

Это отобразит шаблон, расположенный в файле activity/tweet.html, с действием в качестве контекста. Например

{{ activity.actor.username }} said "{{ activity.object.body }} {{ activity.created_at|timesince }} ago"

Полная документация находится здесь: https://github.com/GetStream/stream-django#templating.

Stream Framework позволяет создавать новостные ленты любого типа с помощью Redis или Cassandra. Он масштабируется и создает отдельные новостные ленты, используя процесс разветвления.

Помимо Stream Framework (который я, очевидно, предпочитаю), существует множество других решений. Полный список доступен в пакетах django: https://www.djangopackages.com/grids/g/activities/

Обратите внимание, что при работе с новостными лентами необходимо помнить о некоторых проблемах с масштабированием. В целом есть 3 распространенных подхода:

Стратегии денормализации

Потяните Большинство пользователей начинают именно так. Когда вы открываете страницу канала, вы просто запрашиваете каналы всех пользователей, на которых вы подписаны. Если каналы пользователей хранятся в памяти, это будет продолжать работать в течение достаточно долгого времени. В конце концов, довольно сложно продолжать использовать такую ​​​​стратегию, поскольку вам часто приходится запрашивать большинство узлов, хранящих каналы вашего пользователя.

Push При использовании push информация о ваших действиях записывается во все фиды подписчиков. Конечно, это означает, что вы тратите массу ресурсов впустую, но конечным результатом является заранее рассчитанный фид для каждого пользователя. Этот подход (хотя изначально и не очень эффективный) хорошо масштабируется.

Комбинация В некоторых оптимизированных системах используется комбинация этих двух подходов. Также см. документ Yahoo по этой теме.

Варианты хранения

С точки зрения хранения всех этих данных наиболее распространенными вариантами являются Redis, Cassandra и MongoDB. Давайте быстро сравним их:

Redis Redis чрезвычайно прост в настройке и обслуживании. Однако он хранит данные только в памяти. Это означает, что вам придется оптимизировать способ сериализации данных и, возможно, вернуться к базе данных для менее часто запрашиваемых данных. Другая проблема заключается в том, что добавить машины в ваш кластер Redis непросто.

MongoDB Mongo DB в основном используется несколькими проектами ruby, а также доступна в качестве серверной части для pump.io от e14n. Я лично никогда не запускал его в продакшене, поэтому не могу правильно оценить этот вариант. Однако есть много сообщений в блогах, посвященных проблемам производительности, масштабируемости и удобства обслуживания mongo.

Cassandra Fashiolista, Instagram и Spotify используют Cassandra. Наше размещенное решение также использует Cassandra в качестве серверной части. Эксплуатация чрезвычайно экономична, и вы можете легко добавить больше узлов. Единственная проблема в том, что его сложно настроить и поддерживать.

Статьи

Кроме того, взгляните на эту публикацию о высокой масштабируемости, в которой мы объясняем некоторые связанные с проектом решения: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html

Чтобы узнать больше о дизайне каналов, я настоятельно рекомендую прочитать некоторые статьи, на которых мы основывали Feedly:

person Thierry    schedule 07.10.2014

После дальнейшего поиска в Google и одного полезного ключевого слова ("Activity"), которое упоминал diegueus9 и о котором я раньше не думал, я смог найти более подходящий материал.

Во-первых, два сообщения в блоге о том, как создать тамблблог с помощью django и фреймворка ContentType:

После этого еще один пост, в котором даются предложения о том, как уменьшить проблему запросов (1 + n) (которая изначально была одной из моих проблем, но я не упомянул, чтобы не загромождать вопрос).

И, наконец, повторно используемое приложение Django, в котором есть некоторые функции, которые мне нужны, и которые могут быть полезны для дальнейшего использования:

person Community    schedule 25.01.2010
comment
Вот еще одно приложение потока активности (ссылка на вставленное выше), которое может быть лучше (якобы проще + больше авторов, больше активности) github.com/justquick/django-activity-stream - person toast38coza; 15.03.2011

Общие отношения были бы способом пойти здесь. Просто убедитесь, что вы разрешаете модель самостоятельно, а не присоединяетесь к таблице обновлений.

person Ignacio Vazquez-Abrams    schedule 24.01.2010
comment
Привет, Игнасио, что ты имеешь в виду, когда говоришь о модели самостоятельно? Спасибо за ответ! - person Tiago; 25.01.2010
comment
Используйте различные методы ContentType, чтобы получить соответствующий класс модели, вместо прямого нажатия на поле GenericForeignKey. - person Ignacio Vazquez-Abrams; 25.01.2010
comment
Спасибо за разъяснения, Игнасио! - person Tiago; 25.01.2010