Django-chemin pour la construction d'une « Nouvelles RSS » / « mise à jour d'état » / « flux d'activité »

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

Question

Je voudrais créer une application Django réutilisable qui gère les mises à jour de l'état des utilisateurs. Tout comme "fil de nouvelles" facebook.

Les cas d'utilisation comprend, par exemple:

  • Un professeur peut créer une affectation en raison d'une date et chaque élève peut voir sur le flux de nouvelles que la mission a été créée, avec une courte description, la date à laquelle elle est due et un lien pour voir la description complète .
  • Il peut également télécharger un nouveau fichier PDF qu'il trouve intéressant pour ses étudiants. Sur le fil de nouvelles, les informations concernant ce doit être affiché, par exemple, la description du pdf, un lien pour télécharger et un lien vers elle un aperçu .
  • Un lien vers une vidéo YouTube peut être affiché et sur le Feed Nouvelles est affiche une petite vignette et, en un clic, la vidéo est embbeded en utilisant javascript et l'utilisateur peut regarder tout de suite.

Une préoccupation est de savoir comment gérer les différents types de mises à jour et afficher le bon « code HTML » pour elle. L'autre, qui est plus important, est de savoir comment concevoir les modèles de cette « façon Django ».

A propos de l'ancien, je pourrais penser à deux façons de le faire:

  1. Utilisation de l'héritage du modèle;
  2. Utilisation de relations génériques.

J'ai cherché avant de poster ici, mais je ne trouve rien. J'ai vérifié Pinax pour voir s'ils l'avaient mis en œuvre, mais ils ne sont pas. Donc, je suis ici pour trouver d'autres suggestions sur la façon de gérer cela d'une manière agréable et non-aki.

Merci à l'avance,

Était-ce utile?

La solution

Je peux penser à deux manières:

D'abord, vous pourriez peut-être faire flux pour vos modèles Assigments, PdfFiles et Youtube link, et utiliser la bibliothèque feedparser pour l'intégrer dans votre point de vue de nouvelles, ce sont les moyen facile parce que vous pouvez définir dans les modèles, le code pour chaque type de nouvelle activité.

La deuxième chose que je peux penser est de faire un Activity de classe:

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

Et à travers les signaux faire une nouvelle instance de l'activité chaque fois que vous avez un nouveau téléchargement assigment ou pdf ou un lien youtube, et pour chaque classe faire une méthode comme render_to_html, de cette façon, selon vous, vous pouvez faire un pour plus d'activités et appeler la méthode render_to_html

Autres conseils

Python est en fait une grande langue pour la construction de l'activité et cours d'eau Newsfeeds. Tommaso et moi avons écrit le paquet cadre Stream. https://github.com/tschellenbach/stream-framework Il est actuellement le plus utilisé pour la construction de solution Python newsfeeds. Nous offrons également une solution hébergée à https://getstream.io . Le client Django est de loin le plus facile de commencer avec: https://github.com/GetStream/stream-django et python peut être trouvé ici ( https://github.com/getstream/stream-python )

La partie templating fonctionne comme ceci

{% load stream_django %}

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

Cela rend un modèle situé dans l'activité / tweet.html avec l'activité en tant que contexte. Par exemple

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

Les documents complets sont ici: https://github.com/GetStream/stream-django#templating

Le Cadre flux permet de construire tout type de fil d'actualité en utilisant soit Redis ou Cassandra. Il est construit à l'échelle et crée les newsfeeds individuels à l'aide d'un processus de sortance.

En plus du cadre flux (que je préfère évidemment) il y a beaucoup d'autres solutions là-bas. Une liste complète est disponible sur les emballages django: https://www.djangopackages.com/grids/g/activities/

Notez que avec newsfeeds il y a quelques problèmes de mise à l'échelle de garder à l'esprit. En général, il y a 3 approches communes:

stratégies de dénormalisation

Tirez La plupart des utilisateurs commencent de cette façon. Lorsque vous ouvrez la page d'alimentation vous simplement interroger les flux de tous les utilisateurs que vous suivez. Si les flux utilisateurs sont stockés dans la mémoire ce continuera à travailler pendant un certain temps. Finalement, il est assez difficile de continuer à utiliser tels que la stratégie mais que vous avez souvent d'interroger la plupart des noeuds stockant des flux de l'utilisateur.

Appuyez sur L'approche push écrit votre activité à tous vos disciples flux. Bien sûr, cela signifie que vous perdez une tonne de ressources, mais le résultat final est un aliment pré calculé par utilisateur. Cette approche (bien que d'abord pas très efficace) des échelles bien.

Combinaison Certains systèmes optimisés utilisent une combinaison de ces deux approches. Voir aussi le document Yahoo sur ce sujet.

Options de stockage

En termes de stocker toutes ces données options les plus courantes sont Redis, Cassandra et MongoDB. Comparons rapidement ceux-ci:

Redis Redis est extrêmement facile à installer et à entretenir. Il stocke les données mais seulement dans la mémoire. Cela signifie que vous devrez optimiser la façon dont vous les données de la sérialisation et peut-être REPLI à la base de données pour les données moins fréquemment sollicités. Un autre problème est que ce n'est pas trivial d'ajouter des machines à votre cluster Redis.

MongoDB DB mongo est principalement utilisé par quelques projets de rubis et il est également disponible en tant que back-end pour pump.io par e14n. J'ai personnellement jamais couru dans la production, donc je ne peux pas évaluer correctement cette option. Il y a cependant beaucoup de questions couvrant blogposts avec les performances, l'évolutivité et la maintenabilité de mongo.

Cassandra Fashiolista, Spotify et Instagram utilisent tous Cassandra. Notre solution hébergée utilise également Cassandra comme back-end. Il est extrêmement rentable pour fonctionner et vous pouvez ajouter plusieurs noeuds avec facilité. Le seul problème est qu'il est difficile à installer et à maintenir.

Articles

En plus un coup d'oeil à ce poste de haute évolutivité étaient expliquer quelques-unes des décisions de conception en cause: http://highscalability.com/Blog / 2013/10/28 / conception-décisions pour mise à l'échelle-votre-haut trafic feeds.html

Pour en savoir plus sur la conception d'alimentation Je recommande vivement de lire quelques-uns des articles que nous avons basé Feedly sur:

Après plus googler et un mot-clé utile ( « Activité ») que diegueus9 mentionné et que je ne l'ai pas pensé avant, j'ai pu trouver du matériel plus pertinent.

Tout d'abord, deux messages de blog sur la façon de construire un tumbleblog à l'aide django en utilisant le framework ContentType:

Après cela, un autre poste qui donne des suggestions sur la façon de réduire le (1 + n) interroge problème (qui était l'une de mes préoccupations au départ, mais je ne mentionnais pas pour éviter d'encombrer la question).

Et enfin une application Django réutilisable qui a une partie de la fonction que je avais besoin et peut être utile pour référence ultérieure:

relations génériques seraient la voie à suivre ici. Assurez-vous de résoudre le modèle vous au lieu de se joindre contre la table de mise à jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top