在没有请求对象的情况下获取Django用户ID
我扩展了Django中的CursorDebugWrapper的执行功能,这样我就可以在服务器端跟踪所有执行的SQL语句。代码大概是这样的:
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语句,否则就会把所有用户的SQL都记录下来,完全不知道这些SQL是从哪个用户发出的。如果我能在execute()函数中获取到用户的ID,那我就可以轻松地跟踪每个用户的SQL语句了,但我不知道怎么做,因为我没有请求对象的访问权限。
注意:上面的代码不是我原创的,它来自Django调试工具条。
1 个回答
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:
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
)