检测应用程序中的更改和由单独的应用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。有没有可能没有显式注入请求对象从视图到活动日志应用程序?

你可以添加一个原始中间件到你的"activitylogapp"与process_request存储request

关于request的存储,我看到2个选项:

  1. 很丑,但是实现起来很快。全局保存request。它应该不会影响任何事情,因为您会为每个请求获得一个新的克隆线程,该线程在处理请求后立即死亡。

  2. 更复杂,没有全局变量。利用Django信号对其接收函数创建弱引用这一事实。所以你可以将save_handler连接到request上,它们最终会被GC-ed在一起。像这样:

    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, ...)
    

最新更新