2016-11-05 67 views
0

我正在嘗試創建一個應用程序,在項目中說activitylogapp檢測是否在另一個應用程序中聲明Employeeapp某些模型已更改/更新並保留日誌。我不想觸摸Employeeapp。我可以通過在activitylodapp的models.py中使用信號來訪問更改。通過這樣的:檢測由單獨的應用程序Django進行更改的應用程序和用戶中的更改。

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應用程序?

回答

0

您可以添加原始middleware到您的「activitylogapp」與process_request存儲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, ...)