Django-way для создания "Лента новостей" / "Обновление статуса" / "Активность потока"

Я хотел бы создать многоразовое приложение Django, которое обрабатывает обновления статуса пользователей. Как и в ленте новостей "facebook".

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

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

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

О первом, я мог бы подумать о двух способах этого:

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

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

Спасибо заранее,

Ответы

Ответ 1

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

Во-первых, возможно, вы можете сделать каналы для своих моделей 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')

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

Ответ 2

Python на самом деле является отличным языком для создания потоков активности и Newsfeeds. Мы с Томмазо записали пакет 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 записывает вашу активность всем вашим подписчикам. Конечно, это означает, что вы тратите массу ресурсов, но конечным результатом является предварительно вычисленный фид для каждого пользователя. Этот подход (хотя первоначально не очень эффективный) хорошо масштабируется.

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

Параметры хранения

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

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

MongoDB Mongo DB используется в основном несколькими рубиновыми проектами, а также доступен как backend для pump.io на e14n. Я лично никогда не запускал его в производстве, поэтому я не могу правильно оценить этот вариант. Тем не менее, есть много блог-постов, которые затрагивают проблемы с производительностью, масштабируемостью и ремонтопригодностью монго.

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

Статьи

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

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

Ответ 3

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

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

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

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

Ответ 4

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