我试图创建一个应用程序,比如项目中的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。 是否可以在没有明确地将视图中的请求对象注入活动日志应用程序?
答案 0 :(得分:1)
您可以使用process_request
将原始middleware添加到“activitylogapp”中以存储request
。
至于存储request
,我看到两个选项:
丑陋而快速实施。全局保存request
。它不应该影响任何事情,因为你为每个请求获得一个新的新克隆线程,它在处理请求后立即死亡。
更复杂,没有全局变量。利用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, ...)