2010-01-24 9 views
14

Chciałbym stworzyć aplikację Django do wielokrotnego użytku, która obsługuje aktualizacje statusu użytkowników. Podobnie jak "źródło wiadomości" na Facebooku.Django-sposób budowania "News feed"/"Status update"/"Activity Stream"

Przypadki użycia obejmuje, na przykład:

  • Profesor może tworzyć zadanie ze względu na dany termin i każdy uczeń może zobaczyć na kanał wiadomości, że zadanie zostało utworzone, wraz z krótkim opisem, data to jest wymagane i link , aby zobaczyć pełny opis.
  • Może również przesłać nowy plik PDF, który uzna za interesujący dla swoich uczniów. W kanale informacyjnym należy wyświetlić informacje na ten temat, np. Opis pliku pdf, , łącze do pobrania i link do podglądu go.
  • link do filmu YouTube mogą być publikowane i na RSS News jest wykazywały niewielką miniaturę i, za pomocą jednego kliknięcia, film jest embbeded przy użyciu javascript a użytkownik może oglądać go od razu.

Jednym z problemów jest obsługa różnych rodzajów aktualizacji i wyświetlanie dla nich poprawnego "fragmentu html". Drugim, co ważniejsze, jest zaprojektowanie modeli tego "sposobu Django".

O tych pierwszych, co myślę z dwóch sposobów prowadzenia go:

  1. Korzystanie model dziedziczenia;
  2. Korzystanie z relacji rodzajowych.

Szukałem przed opublikowaniem tutaj, ale niczego nie znalazłem. Sprawdziłem Pinax, aby sprawdzić, czy zostały one zaimplementowane, ale nie. Tak więc szukam dalszych wskazówek, jak sobie z tym poradzić w miły i nie-hacki sposób.

Dzięki z góry,

+1

przyjrzeć za t, jak robimy szablon tutaj: https://github.com/GetStream/stream-django#templating Niestandardowy znacznik szablonu sprawia, że ​​wszystko jest całkiem czyste. – Thierry

Odpowiedz

6

mogę myśleć na dwa sposoby:

Po pierwsze, może można zrobić feeds dla swoich modeli Assigments, PdfFiles i Youtube link i korzystania z biblioteki feedparser osadzić go w widokach wiadomości, jest to prosty sposób ponieważ możesz zdefiniować w szablonach kod każdego rodzaju nowej aktywności.

Drugą rzeczą mogę myśleć to zrobić klasę 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') 

i przez signals utworzyć nową instancję działalności za każdym razem masz nowy assigment lub pdf przesyłanie lub YouTube łącza, a dla każdej klasy uczynić metodę jak render_to_html, w ten sposób Państwa zdaniem można zrobić za nad działalnością i wywołać metodę render_to_html

+0

Witaj diegueus9! Dziękuję za wskazanie struktury pliku danych. Widziałem to połączone w dokumentach, ale nigdy nie sprawdziłem. O modelu Aktywności, wydaje się, że jest to najlepszy sposób, aby to zrobić. – Tiago

+1

Witam Tiago, z przyjemnością, jeśli potrzebujesz więcej pomocy w ramach ContentType lub sygnałów nie wątp w kontakt z mw. – diegueus9

+0

Oba linki są martwe:/ – Hankrecords

3

stosunki Generic byłoby do zrobienia tutaj. Po prostu upewnij się, że rozwiązałeś ten model samodzielnie, zamiast dołączyć do tabeli aktualizacji.

+0

Cześć Ignacio, co masz na myśli mówiąc "rozwiązać samemu model"? Dziękuję za odpowiedź! – Tiago

+1

Użyj różnych metod "ContentType", aby uzyskać odpowiednią klasę modelu, zamiast bezpośrednio naciskać pole "GenericForeignKey". –

+0

Dzięki za wyjaśnienie, Ignacio! – Tiago

4

Po więcej googling i jednego pomocnego słowa kluczowego („Aktywny”), które Diegueus9 wspomniana i że nie myślałem wcześniej, udało mi się znaleźć bardziej odpowiedni materiał.

pierwsze dwa posty na blogach, w jaki sposób zbudować tumbleblog użyciu Django pomocą ContentType ramowa:

Po tym okresie, inne stanowisko, które daje sugestie, w jaki sposób zmniejszyć problem z pytaniami (1 + n) (co było początkowo jednym z moich problemów, ale nie wspomniałem o tym, aby nie zaśmiecać pytania).

I wreszcie wielokrotnego użytku App Django, który ma kilka funkcji, które mi potrzebne i może być przydatna dla dalszego odniesienia:

+4

Oto kolejna aplikacja do strumieniowania aktywności (powiązana z jedną wklejoną powyżej), która może być lepsza (rzekomo prostsza + więcej autorów, większa aktywność). https://github.com/justquick/django-activity-stream – toast38coza

14

Pythonie jest świetnym językiem do budowania strumieni aktywności i kanałów informacyjnych. Tommaso i ja napisaliśmy pakiet Stream Framework. https://github.com/tschellenbach/stream-framework Jest to obecnie najczęściej używane rozwiązanie Python do budowy kanałów informacyjnych. Oferujemy również hostowane rozwiązanie pod adresem https://getstream.io. Klient Django jest zdecydowanie najłatwiej zacząć z: https://github.com/GetStream/stream-django i Python można znaleźć tutaj (https://github.com/getstream/stream-python)

Część szablonów działa tak

{% load stream_django %} 

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

będzie to uczynić szablon znajdujący się w działalność/tweet.html z aktywnością jako kontekstem. Na przykład

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

Pełne docs tutaj: https://github.com/GetStream/stream-django#templating

Ramowa Stream pozwala zbudować dowolny typ kanału informacyjnego przy użyciu albo Redis lub Cassandrę. Jest zbudowany na skalę i tworzy indywidualne kanały informacyjne za pomocą procesu fanout.

Oprócz struktury Stream (którą oczywiście wolę) istnieje wiele innych rozwiązań.Pełna lista dostępna jest na pakietach django: https://www.djangopackages.com/grids/g/activities/

Należy pamiętać, że w przypadku kanałów informacyjnych należy pamiętać o kilku problemach skalowania. Zasadniczo istnieją 3 wspólne podejścia:

strategie Denormalizacja

Pull Najwięcej użytkowników rozpocząć się w ten sposób. Po otwarciu strony kanału możesz po prostu wysyłać zapytania do wszystkich użytkowników, których obserwujesz. Jeśli kanały użytkowników są przechowywane w pamięci, będzie to działało przez dłuższy czas. W końcu dość trudno jest nadal używać strategii, chociaż często trzeba przesyłać zapytania do większości węzłów przechowujących pliki danych użytkownika.

Wciśnij Metoda "push" zapisuje Twoją aktywność we wszystkich kanałach obserwujących. Oczywiście oznacza to, że marnujesz mnóstwo zasobów, ale efekt końcowy to wstępnie obliczony kanał na użytkownika. To podejście (choć początkowo niezbyt wydajne) skaluje się ładnie.

Kombinacja Niektóre zoptymalizowane systemy wykorzystują połączenie tych dwóch podejść. Zobacz także artykuł Yahoo na ten temat.

pamięć masowa

Pod względem przechowywania wszystkich tych danych najczęstsze opcje są Redis, Cassandra i MongoDB. Niech szybko porównać je:

Redis Redis jest niezwykle prosty w instalacji i utrzymaniu. Przechowuje jednak tylko dane w pamięci. Oznacza to, że będziesz musiał zoptymalizować sposób serializowania danych i być może wrócić do bazy danych dla rzadziej sprawdzanych danych. Innym problemem jest to, że dodawanie komputerów do klastra Redis nie jest banalne.

MongoDB Mongo DB jest wykorzystywany przede wszystkim przez kilka projektów rubinowe i jest również dostępny jako backend dla pump.io przez e14n. Osobiście nigdy nie uruchomiłem go w produkcji, więc nie mogę właściwie ocenić tej opcji. Istnieje jednak wiele blogów, które dotyczą problemów z wydajnością, skalowalnością i łatwością obsługi mongo.

Cassandra Fashiolista, Instagram i Spotify używają Cassandry. Nasze hostowane rozwiązanie wykorzystuje także Cassandrę jako zaplecze. Jest niezwykle ekonomiczna w obsłudze i możesz z łatwością dodawać kolejne węzły. Jedynym problemem jest to, że trudno go skonfigurować i obsługiwać.

Artykuły

Ponadto przyjrzeć się tej wysokiej skalowalności postu zostały wyjaśnić niektóre z decyzji projektowych zaangażowanych: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html

Aby dowiedzieć się więcej na temat projektu paszowego Gorąco polecam przeczytaniu niektórych artykuły, które oparliśmy na Feedly: