Django-way за изграждане на News Feed / Актуализация на състоянието / Activity Stream

Бих искал да създам Django приложение за многократна употреба, което обработва актуализации на състоянието на потребителите. Подобно на "новинарската емисия" на Facebook.

Случаите на употреба включват например:

  • Професор може да създаде Задание поради конкретна дата и всеки студент може да види в емисия с новини, че заданието е създадено, с кратко описание, датата, на която трябва да се изпълни и връзка, за да видите пълното описание.
  • Той също така може да качи нов PDF файл, който смята за интересен за учениците си. В емисията с новини информацията относно това трябва да се показва, напр. описанието на pdf файла, връзка за изтегляне и връзка за предварителен преглед.
  • Може да бъде публикувана връзка към видеоклип в YouTube и в News Feed се показва малка миниатюра и с едно щракване видеото се вгражда с помощта на 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 Activities и да извикате метода 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 всъщност е страхотен език за изграждане на потоци от дейности и емисии с новини. Tommaso и аз написахме пакета 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 общи подхода:

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

Изтегляне Повечето потребители започват по този начин. Когато отворите страницата с емисии, вие просто правите заявка за емисиите от всички потребители, които следвате. Ако потребителските емисии се съхраняват в паметта, това ще продължи да работи доста време. В крайна сметка е доста трудно да продължите да използвате такава стратегия, тъй като често трябва да правите запитвания до повечето възли, съхраняващи емисиите на вашия потребител.

Натискане Подходът на натискане записва дейността ви във всички ваши емисии на последователи. Разбира се, това означава, че губите много ресурси, но крайният резултат е предварително изчислена емисия за потребител. Този подход (макар и първоначално не много ефективен) се мащабира добре.

Комбинация Някои оптимизирани системи използват комбинация от тези два подхода. Вижте също статията на 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

След повече гугъл и една полезна ключова дума („Дейност“), която diegueus9 спомена и за която не се сетих преди, успях да намеря по-подходящ материал.

Първо, две публикации в блогове за това как да създадете tumbleblog с помощта на 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