Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取没有可用请求对象的Django用户ID_Python_Django - Fatal编程技术网

Python 获取没有可用请求对象的Django用户ID

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:

我扩展了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,而不知道从何处来。如果我可以从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