You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Debug Toolbar无法捕获本地数据库SQL查询问题

Django Debug Toolbar无法捕获宿主机数据库SQL查询问题

依赖版本

django = "4.0.8"
django-debug-toolbar = "^4.3.0"
drf-spectacular = "^0.26.5"

问题描述

Django容器已通过host.docker.internal连接宿主机本地PostGIS数据库,调用API能正常返回数据库数据,但Debug Toolbar面板无SQL查询记录,进入SQL页面显示:

SQL queries from 0 connections
No SQL queries were recorded during this request.

已尝试调整INTERCEPT_REDIRECTS为True/False,均无效。

相关配置

Docker额外主机配置

extra_hosts:
    - "host.docker.internal:host-gateway"

.local.env配置

DB_ENGINE="django.contrib.gis.db.backends.postgis"
DB_HOST="host.docker.internal"
DEBUG=True

local_settings.py

from dotenv import load_dotenv

load_dotenv(".env.local")

from .base_settings import *

import socket

DEBUG = True

LOGGING["loggers"]["django"]["handlers"] = ["console", "file"]

CORS_ALLOWED_ORIGINS = [
    "http://localhost:8000",
    "http://127.0.0.1:8000",
    "http://localhost:80",
    "http://127.0.0.1:80",
    "http://localhost:3000",
    "http://127.0.0.1:3000",
    "http://host.docker.internal:8000",
]

CORS_ALLOW_METHODS = [
    "GET",
    "POST",
]

INTERNAL_IPS = [
    "*",
    "127.0.0.1",
    "localhost",
    "192.168.0.1",
    "10.0.2.2",
    "host.docker.internal",
]

hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
INTERNAL_IPS += [".".join(ip.split(".")[:-1] + ["1"]) for ip in ips]


def show_toolbar(request):
    return True


DEBUG_TOOLBAR_CONFIG = {
    "INTERCEPT_REDIRECTS": True,
    "SHOW_TOOLBAR_CALLBACK": show_toolbar,
}
if DEBUG:
    import mimetypes

    mimetypes.add_type("application/javascript", ".js", True)

base_settings.py

#...
INSTALLED_APPS = [
    "django.contrib.staticfiles",
    "drf_spectacular",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "real_estate",
    "accounts",
    "modu_property",
    "django_celery_beat",
    "rest_framework",
    "rest_framework_simplejwt",
    "django.contrib.gis",
    "debug_toolbar",
    "corsheaders",
]

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        # "rest_framework_simplejwt.authentication.JWTAuthentication"
    ],
    "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
}

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    "debug_toolbar.middleware.DebugToolbarMiddleware",
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",  # for django debug toolbar css
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]
#...

urls.py

urlpatterns = []
if DEBUG:
    urlpatterns += [
        # path(
        #     "__debug__",
        #     include("debug_toolbar.urls"),
        #     name="debug_toolbar_without_slash",
        # ),
        path(
            "__debug__/", include("debug_toolbar.urls"), name="debug_toolbar_with_slash"
        ),
    ]

#...

urlpatterns += (
    [
        path(
            "api/schema",
            SpectacularAPIView.as_view(),
            name="schema",
        ),
        path(
            "api/docs",
            SpectacularSwaggerView.as_view(url_name="schema"),
            name="swagger-ui",
        ),
        path(
            "api/redoc",
            SpectacularRedocView.as_view(url_name="schema"),
            name="redoc",
        ),
    ]
)

解决方向

  1. 调整Debug Toolbar中间件顺序
    将debug_toolbar.middleware.DebugToolbarMiddleware移到django.middleware.common.CommonMiddleware之后、django.middleware.csrf.CsrfViewMiddleware之前,确保中间件能正确拦截后续请求流程中的数据库操作:

    MIDDLEWARE = [
        "corsheaders.middleware.CorsMiddleware",
        "django.middleware.security.SecurityMiddleware",
        "whitenoise.middleware.WhiteNoiseMiddleware",
        "django.contrib.sessions.middleware.SessionMiddleware",
        "django.middleware.common.CommonMiddleware",
        "debug_toolbar.middleware.DebugToolbarMiddleware",
        "django.middleware.csrf.CsrfViewMiddleware",
        "django.contrib.auth.middleware.AuthenticationMiddleware",
        "django.contrib.messages.middleware.MessageMiddleware",
        "django.middleware.clickjacking.XFrameOptionsMiddleware",
    ]
    
  2. 验证QuerySet是否实际执行
    Django QuerySet是惰性执行的,如果视图中返回的是未迭代的QuerySet,Debug Toolbar不会记录SQL查询。可以在视图中强制迭代QuerySet,比如用list(Model.objects.all()),再测试是否能捕获查询。

  3. 检查缓存使用情况
    若API数据来自缓存而非数据库查询,Debug Toolbar自然不会记录SQL。可以临时禁用缓存,或在视图中跳过缓存直接查询数据库,验证是否能捕获记录。

  4. 确认Debug Toolbar激活状态
    在视图中添加代码打印工具栏激活状态:

    from debug_toolbar.middleware import get_show_toolbar
    
    def your_view(request):
        print(get_show_toolbar()(request))  # 应返回True
        # ... 其他视图逻辑
    

    确保工具栏确实在当前请求中被激活。

内容的提问来源于stack exchange,提问作者user16613127

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 11:54:52