2010-01-24 11 views
14

Mi piacerebbe creare un'app Django riutilizzabile che gestisca gli aggiornamenti di stato degli utenti. Proprio come "news feed" di Facebook.Django-way per la creazione di un "News Feed"/"Aggiornamento stato"/"Streaming attività"

I casi d'uso includono, per esempio:

  • Un professore può creare un Assegnazione a causa di una data specifica e ogni studente può vedere sul news feed che l'assegnazione è stato creato, con una breve descrizione, la data che è dovuto e un collegamento per vedere la descrizione completa.
  • Inoltre può caricare un nuovo PDF che trova interessante per i suoi studenti. Nel feed delle notizie, dovrebbero essere visualizzate le informazioni relative a questo, ad esempio la descrizione del pdf, , un collegamento per il download e un collegamento per visualizzarlo in anteprima.
  • Un link ad un video di YouTube può essere pubblicato e sul News Feed è visualizzata una piccola miniatura e, con un clic, il video è embbeded utilizzando JavaScript e l'utente può guardare subito.

Una preoccupazione è come gestire diversi tipi di aggiornamenti e visualizzare il corretto "snippet html" per esso. L'altro, che è più importante, è come progettare i Modelli di questo "modo Django".

A proposito di ex, mi veniva in mente due modi per farlo:

  1. utilizzando il modello di eredità;
  2. Utilizzo di relazioni generiche.

Ho cercato prima di postare qui, ma non ho trovato nulla. Ho controllato Pinax per vedere se l'avevano implementato, ma loro no. Quindi, sto cercando ulteriori suggerimenti su come gestirlo in un modo piacevole e non hacky.

Grazie in anticipo,

+1

Date un'occhiata un t come facciamo il template qui: https://github.com/GetStream/stream-django#templating Il tag del modello personalizzato rende tutto molto pulito. – Thierry

risposta

6

posso pensare in due modi:

In primo luogo, forse si potrebbe fare feeds per i vostri modelli Assigments, PdfFiles e Youtube link, e utilizzare la libreria feedparser per incorporare nel vostro punto di vista di notizie, questo è il modo più semplice perché puoi definire nei template il codice per ogni tipo di nuova attività.

La seconda cosa che mi viene in mente è quello di fare una classe 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') 

E attraverso la signals fare una nuova istanza di attività ogni volta che avete un nuovo assigment o pdf caricamento o link di YouTube, e per ogni classe rendere un metodo come render_to_html, in questo modo, a suo avviso, è possibile effettuare una per più di attività e chiamare il metodo render_to_html

+0

Ciao diegueus9! Grazie per aver segnalato la struttura del feed. L'ho visto collegato nei documenti, ma non l'ho mai verificato. Informazioni sul modello di attività, sembra essere il modo migliore per farlo. – Tiago

+1

Ciao Tiago, piacere, se hai bisogno di più aiuto con il framework ContentType o segnali non dubitare di contattare mw. – diegueus9

+0

Entrambi i collegamenti sono morti:/ – Hankrecords

3

rapporti generici sarebbe il modo di andare qui. Assicurati di risolvere il modello da solo invece di unirti alla tabella degli aggiornamenti.

+0

Ciao Ignacio, cosa intendi con "risolvere il modello da solo"? Grazie per la risposta! – Tiago

+1

Utilizzare i vari metodi 'ContentType' per ottenere la classe del modello appropriata invece di eseguire direttamente il campo' GenericForeignKey'. –

+0

Grazie per il chiarimento, Ignacio! – Tiago

4

Dopo più googling ed un utile parola chiave ("Attività") che diegueus9 menzionato e che non ho pensato prima, sono stato in grado di trovare materiale più rilevante.

In primo luogo, due post di blog su come costruire un tumbleblog utilizzando Django con il ContentType quadro:

Dopo di che, un altro post che dà suggerimenti su come ridurre il problema delle query (1 + n) (che inizialmente era una delle mie preoccupazioni, ma non ho accennato a evitare di ingombrare la domanda).

E, infine, un app Django riutilizzabile che ha alcune delle funzionalità che avevo bisogno e possono essere utili per ulteriori riferimenti:

+4

Ecco un'altra app del flusso di attività (collegata a quella incollata sopra) che potrebbe essere migliore (presumibilmente più semplice + più autori, più attività) https://github.com/justquick/django-activity-stream – toast38coza

14

Python è in realtà un ottimo linguaggio per la costruzione di flussi di attività e newsfeed. Tommaso ed io abbiamo scritto il pacchetto Stream Framework. https://github.com/tschellenbach/stream-framework Attualmente è la soluzione Python più utilizzata per la creazione di newsfeed. Offriamo anche una soluzione hosted allo https://getstream.io. Il cliente Django è di gran lunga il più facile per iniziare con: https://github.com/GetStream/stream-django e pitone può essere trovato qui (https://github.com/getstream/stream-python)

La parte template funziona così

{% load stream_django %} 

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

Questo renderà un modello situato in attività/tweet.html con l'attività come contesto. Per esempio

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

La documentazione completa sono qui: https://github.com/GetStream/stream-django#templating

Il quadro flusso consente di costruire qualsiasi tipo di newsfeed utilizzando Redis o Cassandra. È costruito per scalare e creare i singoli flussi di notizie utilizzando un processo di fanout.

Oltre al framework Stream (che ovviamente preferisco) ci sono molte altre soluzioni là fuori.Un elenco completo è disponibile sui pacchetti django: https://www.djangopackages.com/grids/g/activities/

Si noti che con i newsfeed ci sono alcuni problemi di ridimensionamento da tenere a mente. in generale ci sono 3 approcci comuni:

strategie Denormalizzazione

Pull La maggior parte degli utenti comincia in questo modo. Quando apri la pagina del feed, interroghi semplicemente i feed da tutti gli utenti che segui. Se i feed degli utenti sono archiviati in memoria, questo continuerà a funzionare per parecchio tempo. Alla fine è piuttosto difficile continuare ad usare la strategia, dato che spesso devi interrogare la maggior parte dei nodi che memorizzano i feed dell'utente.

Push L'approccio push scrive la tua attività su tutti i feed dei tuoi follower. Ovviamente questo significa che stai sprecando una tonnellata di risorse, ma il risultato finale è un feed pre-calcolato per utente. Questo approccio (sebbene inizialmente non molto efficiente) si adatta bene.

Combinazione Alcuni sistemi ottimizzati utilizzano una combinazione di questi due approcci. Vedi anche il documento di Yahoo su questo argomento.

opzioni di archiviazione

In termini di memorizzare tutti questi dati le opzioni più comuni sono Redis, Cassandra e MongoDB. Let confrontare rapidamente questi:

Redis Redis è estremamente facile da installare e mantenere. Tuttavia memorizza solo i dati in memoria. Ciò significa che dovrai ottimizzare la modalità di serializzazione dei dati e, eventualmente, il fallback sul database per i dati sottoposti a query meno frequenti. Un altro problema è che non è banale aggiungere macchine al tuo cluster Redis.

MongoDB Mongo DB viene utilizzato principalmente da alcuni progetti rubino ed è anche disponibile come backend per pump.io da e14n. Personalmente non l'ho mai eseguito in produzione, quindi non posso valutare correttamente questa opzione. Esistono tuttavia numerosi post sul blog che trattano problemi con le prestazioni, la scalabilità e la manutenibilità di mongo.

Cassandra Fashiolista, Instagram e Spotify utilizzano Cassandra. Anche la nostra soluzione hosted utilizza Cassandra come back-end. È estremamente conveniente operare ed è possibile aggiungere più nodi con facilità. L'unico problema è che è difficile da configurare e mantenere.

articoli

Inoltre dare un'occhiata a questo post elevata scalabilità sono stati ci spiegano alcune delle decisioni di progettazione coinvolti: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html

Per saperne di più sul design di alimentazione mi raccomando di leggere alcuni dei articoli quali abbiamo basato sulla Feedly:

Problemi correlati