在没有请求对象的情况下获取Django用户ID

2 投票
1 回答
1894 浏览
提问于 2025-04-17 14:53

我扩展了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
)

撰写回答