Django-способ создания "ленты новостей" / "обновление статуса" / " поток активности"
Я хотел бы создать многоразовое приложение Django, которое обрабатывает обновления статуса пользователей. Очень похоже на "ленту новостей" facebook.
варианты использования включают, например:
- профессор может создать задание из-за определенной даты, и каждый студент может увидеть в ленте новостей, что задание было создано, с кратким описанием, датой, которую он должен и ссылке, чтобы увидеть полное описание.
- Он также может загрузить новый файл PDF, он находит интересным для своих учеников. В ленте новостей должна отображаться информация об этом, например, описание pdf,ссылка для загрузки и ссылка для ее предварительного просмотра.
- ссылка на видео YouTube может быть размещена и в Ленте Новостей отображается небольшой эскиз и нажмите видео встраивается с помощью javascript и пользователь может посмотреть его сразу.
одна забота как отрегулировать различное виды обновлений и отображение правильного "фрагмента html" для него. Другое, что более важно, - это то, как проектировать модели этого "пути Джанго".
о первом, я мог бы придумать два способа сделать это:
- использование наследования модели;
- использование общих отношений.
Я искал перед публикацией здесь, но я ничего не нашел. Я проверил Pinax, чтобы узнать, реализовали ли они его, но они этого не делают. Итак, я здесь в поисках больше предложений о том, как справиться с этим приятным и не хакерским способом.
заранее спасибо,
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')
и сигналы сделать новую экземпляр действия каждый раз, когда у вас есть новое назначение или загрузка pdf или ссылка youtube, и для каждого класса сделайте метод, как render_to_html
, таким образом, на ваш взгляд, вы можете сделать for over Activities и вызвать метод render_to_html
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-подход записывает вашу деятельность на все ваши последователи кормятся. Конечно, это означает, что вы тратите массу ресурсов, но конечный результат-предварительно вычисленный канал для каждого пользователя. Этот подход (хотя изначально не очень эффективный) хорошо масштабируется.
сочетание Некоторые оптимизированные системы используют сочетание этих двух подходов. Также см. статью Yahoo по этой теме.
параметры хранения
С точки зрения хранения всех этих данных наиболее распространенными параметрами являются Redis, Cassandra и MongoDB. Давайте быстро сравним эти:
Рэдис Redis чрезвычайно прост в настройке и обслуживании. Однако он хранит данные только в памяти. Это означает, что вам придется оптимизировать сериализацию данных и, возможно, вернуться к базе данных для менее часто запрашиваемых данных. Другая проблема заключается в том, что добавление компьютеров в кластер Redis не является тривиальным.
в MongoDB Mongo DB используется в основном несколькими проектами ruby, а также доступный как backend для насоса.io by e14n. Я лично никогда не запускал его в производстве, поэтому я не могу правильно оценить этот вариант. Однако есть много блогов, охватывающих проблемы с производительностью, масштабируемостью и ремонтопригодностью mongo.
Кассандра Fashiolista, Instagram и Spotify все используют Кассандру. Наше размещенное решение также использует Cassandra в качестве бэкэнда. Она весьма рентабельна для того чтобы работать и вы можете добавить больше узлов легко. Единственный проблема в том, что его трудно настроить и поддерживать.
статьи
кроме того, посмотрите на этот высокий пост масштабируемости, мы объясняем некоторые из проектных решений, связанных: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html
чтобы узнать больше о дизайне корма, я настоятельно рекомендую прочитать некоторые статьи, которые мы основывали Feedly on:
- Исследовательская Работа Yahoo
- Twitter 2013 Redis на основе, С отката
- Кассандра в Instagram
- Etsy масштабирование корма
- история Facebook
- проект Django, С хорошими соглашениями об именах. (Но только база данных)
- http://activitystrea.ms/specs/atom/1.0/ (актер, глагол, объект, цель)
- Quora сообщение о лучших практиках
- Quora масштабирование ленты социальной сети
- Redis ruby пример
- у FriendFeed подход
- настройка Thoonk
- подход Twitter
после более googling и одного полезного ключевого слова ("активность"), что diegueus9 упомянуто и что я не думал раньше, я смог найти более релевантный материал.
во-первых, два сообщения в блоге о том, как построить tumbleblog с помощью django с помощью ContentType
рамки:
- http://ryanberg.net/blog/2008/jun/24/basics-creating-tumblelog-django/
- http://ryanberg.net/blog/2008/jul/2/basics-creating-tumblelog-django-part-2/
после этого еще один пост, который дает предложения о том, как уменьшить проблему (1 + n) запросов (что было одной из моих проблем изначально, но я не упомянул, чтобы избежать загромождения вопрос.)
и, наконец, многоразовое приложение Django, которое имеет некоторые из функций, которые мне нужны и могут быть полезны для дальнейшего использования:
родовые отношения будут сюда. Просто убедитесь в том, чтобы решить модель самостоятельно, а не присоединиться к таблице обновлений.