Django:收集用户、对象活动流

2024-04-26 21:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用django活动流模块收集用户活动。 但是当一个用户(user1)跟随另一个用户(user2)时。在

我需要获取以下用户(user2)的活动流,并按日期和时间组合所有活动(参见下面的代码)。在

随着活动列表的增长,我想我将面临性能和优化问题。 我相信已经有人解决了类似的问题。在

对于如何提高活动生成的效率有什么想法和建议?在

def build_activity(raw_activity):
    activity = []
    for item in raw_activity:
        action_object = get_action_object(item)
        activity.append({
            'user': User.objects.get(pk=int(item.actor_object_id)),
            'verb': item.verb,
            'action_object': action_object[1],
            'type': action_object[0],
            'timestamp': timesince(item.timestamp),
            'datetime': item.timestamp,
        })
    return activity


def activity_stream(user):
    from actstream.models import actor_stream
    raw_activity = actor_stream(user)
    activity = build_activity(raw_activity)
    for following in Follow.objects.filter(user=user):
        stream = actor_stream(following.target_user)
        activity += build_activity(stream)
    return sorted(activity, key=lambda item:item['datetime'], reverse=True)

谢谢

苏丹


Tags: 用户inbuildforstreamrawobjectdef
3条回答

Premature optimization is the root of all evil.

但是如果我要优化它,我可能会生成另一个流,并且操作的时间戳由action_object timestamp设置。。。:)

除非我有一个可验证的性能问题,否则我个人不喜欢过早的优化,因为对我来说,它常常会变成一个无休止的螺旋式的疯狂。你可能会发现这里也是如此。在

在Fashiolista,我们已经公开了构建feed系统的方法。 https://github.com/tschellenbach/Feedly 它是目前最大的开源库,旨在解决这个问题。认为它还解决了开发时间与过早优化的问题。:)

首先,我将Redis作为一个数据存储。以后当你的网站变得更大的时候,搬到卡桑德拉是有意义的。在

构建Feedly的同一个团队还提供了一个托管API,它可以为您处理复杂性。看看getstream.io目前我们有Python、Ruby、Node和PHP的客户机api。此外,由于它基于一个高度优化的Cassandra设置,我们可以定价远远低于一个基于Redis的自托管解决方案的成本。在

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

This tutorial将帮助您使用Redis设置Pinterest的提要之类的系统。这很容易开始。在

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

相关问题 更多 >