Tia*_*ago 15 django status django-models news-feed activity-streams
我想创建一个可重用的Django应用程序来处理用户的状态更新.很像facebook的"新闻提要".
用例包括,例如:
一个问题是如何处理不同类型的更新并为其显示正确的"html片段".另一个更重要的是如何设计这种"Django方式"的模型.
关于前者,我可以想到两种方法:
我在发布之前搜索过,但我没有找到任何东西.我检查了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的一些文章:
我可以用两种方式思考:
首先,也许你可以做饲料为您的模型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
经过更多的谷歌搜索和一个有用的关键词(" 活动 "),他们提到了我之前没有想过的,我能够找到更多相关的材料.
首先,关于如何使用ContentType框架使用django构建tumbleblog的两篇博文:
在那之后,另一篇文章提出了如何减少(1 + n)查询问题的建议(这是我最初的担忧之一,但我没有提及避免混淆问题).
最后是一个可重用的Django应用程序,它具有我需要的一些功能,可以用于进一步参考:
| 归档时间: |
|
| 查看次数: |
10724 次 |
| 最近记录: |