2013-02-05 3 views
1

Django CursorDebugWrapper 실행 루틴을 확장하여 서버 측에서 실행 된 모든 SQL을 추적 할 수 있습니다. 다음과 같습니다요청 객체없이 Django 사용자 ID 가져 오기

class PrintQueryWrapper(django.db.backends.util.CursorDebugWrapper): 
    def execute(self, sql, params=()): 
     try: 
      return self.cursor.execute(sql, params) 
     finally: 
      # record sql and do other stuff 

django.db.backends.util.CursorDebugWrapper = PrintQueryWrapper 

문제는 내가 개별적으로이 작업을 수행하는 각 사용자 세션을 필요로한다는 것입니다, 그렇지 않으면 어디에서 와서 무엇의 개념이 모든 사용자의 모든 SQL을 기록합니다. execute()에서 사용자 ID에 액세스 할 수 있으면 각 사용자의 SQL을 쉽게 추적 할 수 있지만 요청 객체에 액세스하지 않고도이를 수행하는 방법을 알지 못합니다.

참고 : 위의 코드에 대한 크레딧을 주장 할 수 없습니다. 장고 디버그 툴바에서 유래했습니다.

답변

1

당신은 미들웨어와 그것을 만들 수 있습니다 :

middleware.py :

import django.db.backends.util 


class PrintQueryWrapper(django.db.backends.util.CursorDebugWrapper): 
    user_id = None 
    def execute(self, sql, params=()): 
     try: 
      return self.cursor.execute(sql, params) 
     finally: 
      print self.user_id, ": ", sql 

class PrintQueryMiddleware(object): 
    def process_request(self, request): 
     PrintQueryWrapper.user_id = request.user.pk 
     django.db.backends.util.CursorDebugWrapper = PrintQueryWrapper 

settings.py : 제안의 ndpu에 대한

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'main.middleware.PrintQueryMiddleware',   # chnage path to your app 
) 
+0

감사합니다. 그것을 밖으로 시도하고 곧 결과를 게시 할 것입니다. – JCB

+0

성공! 감사. – JCB

관련 문제