Django vías para la construcción de un “News Feed” / “actualización de estado” / “Activity Stream”

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

Pregunta

Me gustaría crear una aplicación Django reutilizable que las actualizaciones de estado mangos de los usuarios. Al igual que "servicio de noticias" de Facebook.

Los casos de uso incluye, por ejemplo:

  • Un profesor puede crear una asignación debido a una fecha específica y cada estudiante puede ver en el canal de noticias que se creó la asignación, con una breve descripción, la fecha en que es exigible y un enlace para ver la descripción completa .
  • También puede cargar un nuevo PDF que le resulta interesante para sus alumnos. En el servicio de noticias, la información respecto a este se debe mostrar, por ejemplo, la descripción de la función de densidad, un enlace para descarga y un enlace a una vista previa .
  • Un enlace a un vídeo de YouTube puede ser publicado y en el News Feed es muestra una pequeña miniatura y, con un clic, El video es embbeded usando javascript y la usuario puede ver de inmediato.

Una de las preocupaciones es cómo manejar diferentes tipos de cambios y mostrar la correcta "de fragmentos de HTML" para ello. El otro, que es más importante, es la forma de diseñar los modelos de este "camino Django".

Sobre el primero, no podía pensar en dos maneras de hacerlo:

  1. Uso de la herencia Modelo;
  2. Uso de las relaciones genéricas.

he buscado antes de publicar aquí, pero no encontré nada. Revisé Pinax para ver si tenían que implementar, pero no lo hacen. Por lo tanto, estoy aquí en busca de más sugerencias sobre cómo manejar esto en un bonito y no hacky manera.

Gracias de antemano,

¿Fue útil?

Solución

se me ocurre de dos maneras:

En primer lugar, tal vez usted podría hacer alimentaciones para sus modelos Assigments, PdfFiles y Youtube link, y el uso de la biblioteca feedparser para incrustarla en sus puntos de vista de usuarios, este es el manera fácil porque se puede definir en las plantillas, el código para cada tipo de nueva actividad.

La segunda cosa que se me ocurre es hacer una Activity clase:

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')

Y a través de las señales hacer una nueva instancia de la Actividad cada vez que tenga una nueva assigment o pdf carga o link de youtube, y para cada clase realizar un método como render_to_html, de esta manera, en su opinión, se puede hacer una de más de Actividades y llame al método render_to_html

Otros consejos

Python es en realidad un gran lenguaje para la construcción de Flujos de actividad y Canales. Tommaso y me han escrito el paquete Marco de corriente. https://github.com/tschellenbach/stream-framework Actualmente, es la solución de Python más utilizado para la construcción de fuentes de noticias. También estamos ofreciendo una solución alojada en https://getstream.io . El cliente Django es, con mucho, el más fácil de empezar a trabajar con: https://github.com/GetStream/stream-django y Python se puede encontrar aquí ( https://github.com/getstream/stream-python )

La parte de plantillas funciona de la siguiente

{% load stream_django %}

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

Esto hará que una plantilla situada en la actividad / tweet.html con la actividad como contexto. Por ejemplo

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

Los documentos completos están aquí: https://github.com/GetStream/stream-django#templating

El Marco de corriente le permite construir cualquier tipo de suministro de noticias usando Redis o Cassandra. Es la acumulación a escala y crea los paquetes de noticias individuales utilizando un proceso de despliegue en abanico.

Además de la Corriente del marco (que, obviamente, yo prefiero) hay muchas otras soluciones por ahí. Una lista completa está disponible en paquetes de Django: https://www.djangopackages.com/grids/g/activities/

Tenga en cuenta que con los paquetes de noticias hay algunas cuestiones de escala a tener en cuenta. En general hay 3 común se acerca:

estrategias Denormalization

pull La mayoría de los usuarios comienzan a cabo de esta manera. Al abrir la página de alimentación sólo tiene que consultar los feeds de todos los usuarios que sigues. Si los vínculos de los usuarios se almacenan en la memoria este seguirá trabajando desde hace bastante tiempo. Con el tiempo, es bastante difícil de seguir utilizando como estrategia, aunque como a menudo hay que consulta la mayoría de los nodos de almacenamiento de alimentos de su usuario.

Pulsar El enfoque de empuje escribe su actividad a todos sus feeds seguidores. Por supuesto, esto significa que usted está perdiendo una gran cantidad de recursos, pero el resultado final es un pre calculada alimentación por usuario. Este enfoque (aunque en un principio no es muy eficiente) escalas muy bien.

Combinación Algunos sistemas optimizados utilizan una combinación de estos dos enfoques. Véase también el documento de Yahoo sobre este tema.

Opciones de almacenamiento

En términos de almacenar todos estos datos las opciones más comunes son Redis, Cassandra y MongoDB. Vamos a comparar rápidamente los siguientes:

Redis Redis es extremadamente fácil de instalar y mantener. No obstante, sólo almacena los datos en la memoria. Esto significa que usted tiene que optimizar cómo serializar los datos de reserva y tal vez a la base de datos para los datos menos frecuentemente consultados. Otro problema es que no es trivial para añadir máquinas al clúster Redis.

MongoDB MongoDB es utilizado principalmente por unos pocos proyectos de rubí y también está disponible como backend para pump.io por e14n. Yo personalmente nunca he corrió en la producción de lo que no puede evaluar adecuadamente esta opción. Sin embargo, hay una gran cantidad de entradas del blog que cubren problemas con el rendimiento, la escalabilidad y capacidad de mantenimiento de mongo.

Cassandra Fashiolista, Instagram y Spotify están utilizando Cassandra. Nuestra solución alojada también utiliza Cassandra como backend. Es mucho más económico de operar y se puede añadir más nodos con facilidad. El único problema es que es difícil de configurar y mantener.

artículos

Además de echar un vistazo a este alto cargo escalabilidad estábamos explicar algunas de las decisiones de diseño que participan: http://highscalability.com/Blog / 2013/10/28 / design-decisiones-de-escalamiento-su-alto tráfico-feeds.html

Para aprender más sobre el diseño de alimentación le recomiendo la lectura de algunos de los artículos que nos basamos en Feedly:

Después de más buscando en Google y una palabra clave útil ( " Actividad ") que diegueus9 mencionado y que no he pensado antes, yo era capaz de encontrar el material más relevante.

En primer lugar, dos entradas de blog sobre cómo construir un tumbleblog usando Django utilizando el marco ContentType:

Después de eso, otro post que da sugerencias sobre cómo reducir el (1 + n) consulta problema (que era una de mis preocupaciones al principio, pero no mencionó a evitar llenar la pregunta).

Y por último una aplicación Django reutilizable que tiene algunas de las características que necesitaba y puede ser útil para mayor referencia:

Las relaciones genéricas sería el camino a seguir aquí. Sólo asegúrese de que para resolver el modelo de sí mismo en lugar de unirse en contra de la tabla de actualización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top