如何在网站中存储所有用户活动..?

时间:2012-03-30 11:39:12

标签: java python django postgresql user-activity

我在Django + Python中构建了一个与Web服务交互的Web应用程序(用 JAVA 编写)。

现在所有 数据库管理 部分都是由网络服务完成的,即所有 CRUD 操作到实际数据库都是由网络服务完成的。


现在我必须在某个日志表跟踪我的网站上的所有用户活动

如果用户发布了一篇新文章,那么Web服务会将文章表创建一个新行,并且我需要在日志表中添加一个新行< / strong>,类似于“用户:拉曼发布了一篇新文章(带有ID,标题等)

我必须为我的数据库中的所有对象执行此操作,如“文章”,“媒体”,“评论”等


注意:我正在使用PostgreSQL


那么实现这个目标的最佳方式是什么? (我应该在 PostgreSQL JAVA .. ?? ..以及如何...... ??)

5 个答案:

答案 0 :(得分:1)

所以,你有UI <-> Web Services <-> DB

由于 Web服务与数据库通信,并且Web服务包含业务逻辑(即我猜你在那里验证了什么,创建查询并执行它们),那么最好的地方是' log'活动就在服务中。

IMO,记录 PostgreSQL 交易是另一回事。这与记录“用户活动”不再相同。

编辑:这仍然意味着您为“日志”创建数据库架构并将其写入数据库。

第二次编辑:用户界面中捕获有关日志的事件,然后从那里记录它们可能也不是最好的主意。如果您决定更换UI,或者例如为移动设备或其他内容编写备用UI,则必须重写日志记录。

答案 1 :(得分:1)

对于DB本身的审计表,请查看PL/pgSQL Trigger Audit Example

这会将每个INSERT,UPDATE,DELETE记录到另一个表中。

答案 2 :(得分:0)

在您的日志表中,您可以拥有各种列,包括:

  • user_id(执行操作的用户)
  • activity_type(活动类型,例如viewcommented_on
  • object_id(它关注的实际对象,例如文章或媒体)
  • object_type(对象的类型;稍后可以使用它与object_id结合使用来查找数据库中的对象)

这样,您可以跟踪用户执行的所有操作。每当您想要跟踪的事情发生时,您都需要更新此表。

答案 3 :(得分:0)

每当我们必须这样做时,我们就会为每个模型和可能的行动覆盖信号。

https://docs.djangoproject.com/en/dev/topics/signals/

您可以让信号做任何您想做的事情,从将一些HTML注入页面,到在数据库中创建一个条目。它们是学习使用的绝佳工具。

答案 4 :(得分:-1)

我使用了django-audit-log,我非常满意。

Django-audit-log可以在其自己的附加表中跟踪多个模型。所有这些表都非常统一,因此创建一个显示所有模型数据的SQL视图应该相当简单。

以下是我为跟踪单个模型(“Pauza”)所做的工作:

class Pauza(models.Model):
    started      = models.TimeField(null=True, blank=False)
    ended        = models.TimeField(null=True, blank=True)
    #... more fields ...

    audit_log = AuditLog() 

如果您希望在Django Admin中显示更改,可以创建unmanaged model(但这绝不是必需的):

class PauzaAction(models.Model):

    started      = models.TimeField(null=True, blank=True)
    ended        = models.TimeField(null=True, blank=True)
    #... more fields ...

    # fields added by Audit Trail:
    action_id    = models.PositiveIntegerField(primary_key=True, default=1, blank=True)
    action_user  = models.ForeignKey(User, null=True, blank=True)
    action_date  = models.DateTimeField(null=True, blank=True)
    action_type  = models.CharField(max_length=31, choices=(('I', 'create'), ('U', 'update'), ('D', 'delete'),), null=True, blank=True)
    pauza        = models.ForeignKey(Pauza, db_column='id', on_delete=models.DO_NOTHING, default=0, null=True, blank=True)

    class Meta:
        db_table = 'testapp_pauzaauditlogentry'
        managed = False
        app_label = 'testapp'

testapp_pauzaauditlogentry由django-audit-log自动创建,这只是创建一个用于显示数据的模型。 抛出一些粗鲁的篡改保护可能是个好主意:

class PauzaAction(models.Model):

    # ... all like above, plus:

    def save(self, *args, **kwargs):
        raise Exception('Permission Denied')
    def delete(self, *args, **kwargs):
        raise Exception('Permission Denied')

正如我所说的,我想你可以用四个action_字段创建一个SQL视图,另外一个'action_model'字段可以包含对模型本身的varchar引用(可能只是原始表名)。