【问题标题】:Django: auditing models and recording admin usageDjango:审核模型并记录管理员使用情况
【发布时间】:2012-07-26 13:05:08
【问题描述】:

我正在尝试找到在我的 Django 项目中审核某些模型的最佳方法。提供一些上下文:该网站有帐户、项目和用户。其中任何一个都可以标记为活动或非活动。当项目的活动状态发生变化时,我想记录更改它的工作人员的日期和用户名。

我已经研究了几种解决此审计问题的方法,但我希望 StackOverflow 社区可以为我指出一些更好的解决方案。 Django 内置的管理界面历史具有很好的格式,但还不够详细。它只告诉我一个项目已更改,但不告诉我它设置为什么状态:

如果我可以更改操作消息并仅记录某些字段的操作(而排除其他字段),我会喜欢使用 Django 的内置历史记录。

我下一次解决这个审计问题的尝试是研究插件。 Django Reversion 似乎是最受欢迎的,但我不需要它的大部分功能,而且它确实面向版本控制而不是审计。我还发现了一个名为 AuditTrail 的插件,但它非常原始。

在尝试了这些可能性之后,我尝试推出自己的审计代码。我创建了一个新模型来记录活动。每次激活/停用帐户、项目或用户时都会写入一个条目。

class ActivityHistory(models.Model):
    """
    Stores the history of when accounts, projects, and users are active.
    This class uses generic relations in order to point to any model type.
    For more information see: https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations
    """
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    active = models.BooleanField(help_text="The target state (true if the item was activated, false if it was deactivated).")
    date = models.DateTimeField(help_text="The time at which the active state was changed.")
    actor = models.ForeignKey(User, help_text="The staff member who changed the active state of the account, project, or user in question.")
    class Meta:
        ordering = ['-date']

问题在于我必须使用信号记录信息。在信号处理程序中,我无权访问 HTTP request 对象。那么如何记录哪个工作人员更改了有问题的项目呢?

对于这个问题还有其他更容易实施的解决方案吗?

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    您可以重新实现 Django 的 ModelAdmin 的construct_change_message 方法并在其中添加您的功能,这样您就可以利用现有的功能。

    然而这并没有被记录,所以它可能会在未来的 Django 版本中改变

    https://github.com/django/django/blob/master/django/contrib/admin/options.py#L665

    【讨论】:

    • 是的,我想过。我宁愿不对 Django 库本身进行更改。这会将我的代码与特定版本的 Django 紧密耦合。
    【解决方案2】:

    与其自己从头开始实施,我建议您看看现有解决方案是否能满足您的需求,或者几乎可以满足您的需求。分叉,根据您的需要扩展它,如果您觉得不错,请分享回来!

    我在最近的项目中使用了django-audit,并且对它相当满意(做了一些调整)。我现在尝试的另一个不错的选择是django-audit-log

    【讨论】:

      猜你喜欢
      • 2021-12-11
      • 2017-08-06
      • 2011-01-26
      • 1970-01-01
      • 2010-12-05
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多