Django-way для создания «новостной ленты» / «Обновление статуса» / «Поток деятельности»

StackOverflow https://stackoverflow.com/questions/2128886

Вопрос

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

Во -первых, может быть корм для ваших моделей 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, Таким образом, по вашему мнению, вы можете сделать для чрезмерных действий и вызвать метод 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

Структура потока позволяет создавать любой тип новостей, используя Redis или Cassandra. Это сборка для масштабирования и создает отдельные новостные ленты, используя процесс фаната.

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

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

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

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

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

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

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

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

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

MongodbMongo DB используется в первую очередь несколькими проектами Ruby, а также доступен в качестве бэкэнда для pump.io от E14N. Я лично никогда не запускал его в производстве, поэтому я не могу должным образом оценить этот вариант. Тем не менее, есть много постов, охватывающих проблемы с производительностью, масштабируемостью и обслуживаемостью Mongo.

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

Статьи

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

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

Похоже, вы используете решение песочника для решения вас.Но я не преданно, как это может быть, потому что вы не можете затроить веб-шаблон как песочницу.Я думаю, что вы создали другой проект, который содержит новую функцию.Если он является TURE, вы должны выбрать этот проект и установить SANDBOADED SLICE Свойство для False в окне свойств.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top