Python 获取没有可用请求对象的Django用户ID
我扩展了Django CursorDebugWrapper执行例程,以便在服务器端跟踪所有执行的SQL。看起来像这样:Python 获取没有可用请求对象的Django用户ID,python,django,Python,Django,我扩展了Django CursorDebugWrapper执行例程,以便在服务器端跟踪所有执行的SQL。看起来像这样: class PrintQueryWrapper(django.db.backends.util.CursorDebugWrapper): def execute(self, sql, params=()): try: return self.cursor.execute(sql, params) finally:
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,但是如果没有对请求对象的访问权,我不知道如何做到这一点
注:我不能申请上述代码的信用。它起源于Django调试工具栏。您可以使用中间件实现它: 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
)
您可以使用中间件实现: 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
)
谢谢你的建议。将很快试用并发布结果。如果一个请求将
CursorDebugWrapper更改为PrintQueryWrapper
,同时另一个请求将CursorDebugWrapper更改为PrintQueryWrapper
,如果前一个请求仍在运行,则它将使用第二个用户ID感谢ndpu的建议。将很快试用并发布结果。如果一个请求将CursorDebugWrapper更改为PrintQueryWrapper
,同时另一个请求将CursorDebugWrapper更改为PrintQueryWrapper
,如果前一个请求仍在运行,则它将使用第二个用户id