学习安装Django调试工具条

377 阅读4分钟

在Django网络应用程序的引擎盖下有很多活动部件。其中大部分对网站的用户来说是非常透明的,但对于网站开发者来说,了解事情是如何运作的是非常重要的,这样才能了解如何调试问题。Django有一个Debug Toolbar,你可以安装它,以便在开发过程中对Django环境进行全面检查。安装后,如果你在本地加载你的网络应用程序,你会在调试面板上看到无数的信息,这些信息现在显示在你浏览器的右侧。在本教程中,我们将安装Django调试工具条,并使用它来检查诸如设置、头文件、HTTP请求、SQL查询、静态文件、模板、信号等内容。


安装Django Debug工具条

安装调试工具栏是非常容易的。第一步是简单地使用 pip 将 python 包添加到你的系统中。在命令行输入pip install django-debug-toolbar

djangotutorial $pip install django-debug-toolbar
Requirement already satisfied: django-debug-toolbar

我们已经安装了工具条,所以我们得到的消息是已经满足了要求。很好!


配置调试工具条

在你的机器上安装python包还不足以让调试工具栏在你的网络浏览器中显示。我们需要在Django设置中配置调试工具栏以激活它。这在settings.py文件和urls.py文件中完成。

djangotutorial/settings.py
在我们的设置文件中,我们做了以下突出的修改。这些都是在 INSTALLED_APPS、MIDDLEWARE 和 INTERNAL_IPS 变量中。

"""
Django settings for djangotutorial project.

Generated by 'django-admin startproject' using Django 3.0.

For more information on this file, see
https://docs.djangoproject.com/en/3.0/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.0/ref/settings/
"""

import os

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'n_x6notgo^4gs&real$zlnxsillyf(r187d6#q=)wqx4rt0!q'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'djangodogs',
    'debug_toolbar'
]

MIDDLEWARE = [
    'debug_toolbar.middleware.DebugToolbarMiddleware',
    'django.middleware.security.SecurityMiddleware',
    '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'
]

ROOT_URLCONF = 'djangotutorial.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

WSGI_APPLICATION = 'djangotutorial.wsgi.application'

# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.0/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

INTERNAL_IPS = [
    '127.0.0.1'
]

djangotutorial/urls.py
在urls.py中,我们只需要做一些编辑。下面是我们的配置方式。

from django.contrib import admin
from django.urls import include, path
from djangodogs import views
import debug_toolbar

urlpatterns = [
    path('__debug__/', include(debug_toolbar.urls)),
    path('admin/', admin.site.urls),
    path('', views.home, name='home'),
    path('dogs/<id>/', views.dog_detail, name='dog_detail'),
]

启动你的引擎!(服务器)

一切准备就绪,现在我们可以用python manage.py runserver命令运行我们的python服务器。一旦服务器运行,我们加载我们最近一直在做的项目的主页,我们就会看到一些新的东西!

djando debug toolbar display

上面的截图是网站的主页,右边显示了新的Django Debug Toolbar。正如你所看到的,它提供了几个面板,如版本、时间、设置、头文件、请求、SQL、静态文件、模板、缓存、信号、日志和分析。

设置

设置面板提供了关于当前Django项目的信息。当你点击设置面板时,所有的项目级设置都会显示出来。

django debug toolbar settings

页眉

头部面板显示关于请求头、响应头和WSGI环境的信息。所有这些对于理解你的应用程序中任何页面的请求-响应周期都很有用。

django debug toolbar headers

请求

请求面板有一些关于视图、Cookies、会话数据以及是否有任何GET或POST变量的伟大信息。我们在这里访问的是主页,我们可以准确地看到有视图函数负责渲染模板。视图参数、关键字参数和URL名称也会显示出来。调试工具栏是一个神奇的工具,可以真正了解你的Django应用程序中的工作情况。

request panel django debug toolbar

SQL

调试工具栏的SQL面板非常酷。当你点击这个面板时,它会显示为给定页面提供数据所需的任何SQL查询。此外,在显示的SQL查询中,你可以点击Sel或Expl按钮来运行或解释相关的SQL查询。

debug django sql query

下面是一个运行所显示的查询的例子。
sql query executed django debug

所以,现在我们知道,当加载我们网站的主页时,所执行的查询之一是以下内容。

SELECT "djangodogs_dog"."id",
       "djangodogs_dog"."name",
       "djangodogs_dog"."breed",
       "djangodogs_dog"."description"
  FROM "djangodogs_dog"

非常整洁!但这是如何发生的呢?你可能还记得,当我们建立这个Django项目时,我们从未在Python代码中实际输入过任何SQL语句。这是因为Django有它自己的内置ORM或对象-关系映射器。这意味着我们只需要使用Django ORM提供的任何方法,它就会为我们运行所需的SQL查询。因此,我们项目中产生上述SQL查询的代码是在djangodogs/views.py文件中找到的。这一行代码在这里被突出显示。

from django.shortcuts import render
from .models import Dog
from django.http import Http404


def home(request):
    dogs = Dog.objects.all()
    return render(request, 'home.html', {'dogs': dogs})


def dog_detail(request, id):
    dog = Dog.objects.get(id=id)
    return render(request, 'dog_detail.html', {'dog': dog})

正如你所看到的,这对了解你的Django应用程序如何与数据库进行交互是非常有用的。此外,当你对数据库的查询变得越来越复杂时,你可以使用调试工具栏来查看Django ORM发送给数据库的确切SQL语句。

Django调试工具条摘要

Django调试工具条是使用Django开发的一个伟大工具。它有一组可配置的面板,显示关于你的Django项目的各种有用的调试信息。当这些面板被点击时,它们会显示详细的信息,正如我们在上面的例子中看到的那样。