检测通过单独的应用程序Django进行更改的应用程序和用户的更改。

时间:2016-11-05 13:56:25

标签: python django

我试图创建一个应用程序,比如项目中的activitylogapp,它检测是否在另一个应用程序中说Employeeapp某些模型已更改/更新并保留日志。我不想触摸Employeeapp。我可以通过使用activitylodapp的models.py中的信号来访问更改。通过这个:

from django.db.models.signals import post_save
from anotherapp.models import Employee
from django.dispatch import receiver

@receiver(post_save, sender=Employee)
def save_handler(sender, instance, created, **kswargs):
    "Things I want to do"

问题是我还想访问哪些用户进行了这些更改,例如在views.py中使用的request.user.username。 是否可以在没有明确地将视图中的请求对象注入活动日志应用程序?

1 个答案:

答案 0 :(得分:1)

您可以使用process_request将原始middleware添加到“activitylogapp”中以存储request

至于存储request,我看到两个选项:

  1. 丑陋而快速实施。全局保存request。它不应该影响任何事情,因为你为每个请求获得一个新的新克隆线程,它在处理请求后立即死亡。

  2. 更复杂,没有全局变量。利用Django信号为其接收函数创建weak references这一事实。因此,您可以将save_handler附加到request本身,最后他们会GC一起编辑。这样的事情:

    class MyMiddleware(object):
    
        def process_request(request):
    
            def save_handler(sender, instance, created, **kswargs):
                user = request.user
                "do the stuff you want to do"
    
            # without the following line, the save_handler will be
            # garbage collected right away since nothing references it
            request._my_save_handler_instance = save_handler 
    
            post_save.register(save_handler, ...)