在Django中存储用户活动记录

22
我希望存储用户的活动,但不确定应该存储在哪里。我认为数据库不是一个选项,因为它会很大。我想知道像Facebook、Dropbox这样的网站如何记住特定用户的所有活动。它不能存储在会话中,因为这不是会话特定而是用户特定的。请给我您的建议。
2个回答

11
通常情况下,您可以使用Django Admin Logs来执行此类操作,如果您愿意的话。
通常情况下,Django会跟踪管理操作,例如创建、更新或删除现有记录。它具有以下结构:
from django.contrib.admin.models import LogEntry

LogEntry.objects.log_action(
                            user_id = ...,
                            content_type_id = ...,
                            object_id = ...,
                            object_repr = ....,
                            change_message = ...,
                            action_flag = ...
                           )

我在我的系统中将其用作记录器,并跟踪每个操作。通常,Django日志会插入、更新或删除在管理员表单上完成的操作,而我会记录我手写的视图和表单操作。此外,您可以使用signals捕获用户操作,如登录/注销。
我定义了新的操作标志。Django使用3个标志:1表示插入,2表示更新,3表示删除。我扩展了该列表,并添加了我的操作标志。
使用这种方法的优点是,正如我所说,您无需处理默认的Django Admin表单和使用这些表单执行的任何操作。

1
我能把 log_actions 改成我的模型 'instances' 吗?这样我就可以跟踪我的自定义模型活动了吗? - Lars
当然可以。您可以随时调用一个方法来插入到这个模式中。默认的 action_flag 有三个值; 1: 插入, 2: 更新, 3: 删除。您可以根据需要扩展自定义操作并将所有内容保存到此表中。 - FallenAngel

9
你可能需要查看django-activity-stream,这是实现活动流规范的一个库。它会在数据库中存储一系列的动作,并允许跟随用户/实体来提供类似于Facebook的功能。
然而,正如你所提到的,这可能会产生庞大的数据集,这对于传统的单一数据库方法可能有些棘手。我不确定像Twitter这样的网站如何处理这个问题,但除非你计划快速扩展,否则标准的数据库方法应该可以使用相当长的时间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接