用于构建"新闻源"/"状态更新"/"活动流"的Django方式

Tia*_*ago 15 django status django-models news-feed activity-streams

我想创建一个可重用的Django应用程序来处理用户的状态更新.很像facebook的"新闻提要".

用例包括,例如:

  • 教授可以根据特定日期创建作业,每个学生都可以在新闻Feed上看到作业的创建,简短描述,到期日期以及查看完整描述链接.
  • 他还可以上传他认为对学生有趣的新PDF.在新闻源上,应显示有关此内容的信息,例如pdf的说明,下载链接和预览链接.
  • 可以发布指向YouTube视频的链接,并在新闻Feed上显示一个小缩略图,只需点击一下,该视频就会使用javascript嵌入,用户可以立即观看.

一个问题是如何处理不同类型的更新并为其显示正确的"html片段".另一个更重要的是如何设计这种"Django方式"的模型.

关于前者,我可以想到两种方法:

  1. 使用模型继承;
  2. 使用通用关系.

我在发布之前搜索过,但我没有找到任何东西.我检查了Pinax,看看他们是否实施了它,但他们没有.所以,我在这里寻找更多关于如何以一种漂亮和非hacky方式处理这个问题的建议.

提前致谢,

Thi*_*rry 16

Python实际上是构建Activity Streams和Newsfeeds的一种很好的语言.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 %}
Run Code Online (Sandbox Code Playgroud)

这将呈现位于activity/tweet.html中的模板,其中活动为上下文.例如

{{ activity.actor.username }} said "{{ activity.object.body }} {{ activity.created_at|timesince }} ago"
Run Code Online (Sandbox Code Playgroud)

完整的文档在这里:https: //github.com/GetStream/stream-django#templating

Stream Framework允许您使用Redis或Cassandra构建任何类型的新闻源.它是按比例扩展并使用扇出过程创建个人新闻源.

除了Stream Framework(我显然更喜欢)之外,还有许多其他解决方案.django软件包提供完整列表:https: //www.djangopackages.com/grids/g/activities/

请注意,对于新闻源,需要记住一些缩放问题.一般来说,有3种常见方法:

非规范化策略

大多数用户都是这样开始的.当您打开供稿页面时,您只需查询您关注的所有用户的供稿.如果用户提要存储在内存中,这将继续工作相当长的一段时间.最终,继续使用诸如策略是非常困难的,因为您经常需要查询存储用户的源的大多数节点.

推送 推送方法将您的活动写入您的所有关注者Feed.当然,这意味着您浪费了大量资源,但最终结果是每个用户预先计算的Feed.这种方法(虽然最初不是非常有效)可以很好地扩展.

组合 一些优化系统使用这两种方法的组合.另请参阅有关此主题的Yahoo文章.

存储选项

在存储所有这些数据方面,最常见的选项是Redis,Cassandra和MongoDB.让我们快速比较一下:

Redis Redis非常易于设置和维护.但它只将数据存储在内存中.这意味着您必须优化序列化数据的方式,并且可能需要回退到数据库以查找频率较低的数据.另一个问题是,将机器添加到Redis群集并非易事.

MongoDB Mongo DB主要由一些ruby项目使用,它也可以作为e14n的pump.io的后端.我个人从未在生产中运行它,所以我无法正确评估此选项.然而,有很多博客文章涉及mongo的性能,可伸缩性和可维护性问题.

Cassandra Fashiolista,Instagram和Spotify都在使用Cassandra.我们的托管解决方案也使用Cassandra作为后端.它的运行成本非常高,您可以轻松添加更多节点.唯一的问题是它很难设置和维护.

用品

另外看看这个高可扩展性的帖子,我们解释了一些涉及的设计决策:http: //highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic- feeds.html

要了解有关Feed设计的更多信息,我强烈建议您阅读我们基于Feedly的一些文章:


die*_*us9 7

我可以用两种方式思考:

首先,也许你可以做饲料为您的模型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')
Run Code Online (Sandbox Code Playgroud)

每当你有一个新的assigment或pdf上传或youtube链接时,通过信号创建一个新的Activity实例,并为每个类创建一个方法,就像render_to_html在你的视图中这样,你可以创建一个for over活动并调用方法render_to_html


Tia*_*ago 5

经过更多的谷歌搜索和一个有用的关键词(" 活动 "),他们提到了我之前没有想过的,我能够找到更多相关的材料.

首先,关于如何使用ContentType框架使用django构建tumbleblog的两篇博文:

在那之后,另一篇文章提出了如何减少(1 + n)查询问题的建议(这是我最初的担忧之一,但我没有提及避免混淆问题).

最后是一个可重用的Django应用程序,它具有我需要的一些功能,可以用于进一步参考:

  • 这是另一个活动流应用程序(链接到上面粘贴的那个)可能更好(据称更简单+更多作者,更多活动)https://github.com/justquick/django-activity-stream (4认同)