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", ), ] )
解决方向
调整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", ]验证QuerySet是否实际执行
Django QuerySet是惰性执行的,如果视图中返回的是未迭代的QuerySet,Debug Toolbar不会记录SQL查询。可以在视图中强制迭代QuerySet,比如用list(Model.objects.all()),再测试是否能捕获查询。检查缓存使用情况
若API数据来自缓存而非数据库查询,Debug Toolbar自然不会记录SQL。可以临时禁用缓存,或在视图中跳过缓存直接查询数据库,验证是否能捕获记录。确认Debug Toolbar激活状态
在视图中添加代码打印工具栏激活状态:from debug_toolbar.middleware import get_show_toolbar def your_view(request): print(get_show_toolbar()(request)) # 应返回True # ... 其他视图逻辑确保工具栏确实在当前请求中被激活。
内容的提问来源于stack exchange,提问作者user16613127
相关产品推荐
相关产品推荐

