检测应用程序中的更改以及由单独的应用程序Django进行更改的用户。

2024-09-30 12:33:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个应用程序,比如项目中的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。 是否可以不显式地将请求对象从视图注入到activitylog应用程序


Tags: 项目djangofrompy模型import应用程序models
1条回答
网友
1楼 · 发布于 2024-09-30 12:33:02

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

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

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

  2. 更复杂,没有全局变量。利用Django信号为其接收器函数创建weak references这一事实。因此,您可以将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, ...)
    

相关问题 更多 >

    热门问题