2016-11-05 2 views
0

나는 다른 응용 프로그램에서 Employeeapp가 일부 모델이 변경/업데이트되고 로그를 유지하는지 여부를 감지하는 프로젝트에서 activitylogapp라고 말합니다. 나는 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

"activitylogapp"에 middleware이라는 기본 문자를 추가하여 process_request을 입력하면 request을 저장할 수 있습니다.

  1. 미운하지만 빠르게 구현하기 위해 다음 request를 저장으로

    , 나는 2 옵션을 참조하십시오. request을 전체적으로 저장하십시오. 요청이 처리 된 직후에 각 요청에 대해 새로운 복제 된 새 스레드를 가져올 때 아무 영향을 미치지 않습니다.

  2. 전역이 없으면 더 정교합니다. Django 신호가 수신기 기능에 weak references을 생성한다는 사실을 이용하십시오. 따라서 을 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, ...)