django debug toolbar on docker

x·2024년 5월 7일
0

django

목록 보기
3/5

django debug toolbar는 SQL 쿼리, 성능 정보, 설정 변수 등 Django 애플리케이션의 디버깅에 도움이 되는 다양한 정보를 보여준다.

설치
pip install django-debug-toolbar or poetry add django-debug-toolbar

settings.py 파일에 설정을 해줘야 한다.

INSTALLED_APPS = [
    "debug_toolbar",
	"django.contrib.staticfiles",
]

STATIC_URL = "static/"

middleware의 맨 앞에 "debug_toolbar.middleware.DebugToolbarMiddleware" 추가. DebugToolbarMiddleware는 GZipMiddleware같이 응답을 인코딩하는 미들웨어보단 나중에 와야하지만 다른 것들보다는 상단에 와야 한다.

if DEBUG:
    MIDDLEWARE = [
        "debug_toolbar.middleware.DebugToolbarMiddleware",
    ] + MIDDLEWARE

APP_DIRS, BACKEND 설정

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",
            ],
        },
    },
]

docker container ip 지정. debug toolbar는 ip 주소가 INTERNAL_IPS에 리스팅된 경우에만 보여진다. local host로 서버를 띄울 땐 "127.0.0.1"이 추가되어야 한다. docker인 경우는 다음과 같다.
DEBUG 모드일 때 SHOW_TOOLBAR_CALLBACK 설정에 의해 모든 요청에 대해 debug toolbar를 보여준다.
socket.gethostbyname_ex(socket.gethostname())으로 호스트 이름으로 ip 주소를 구하고 각 ip의 마지막 값을 1로 변경한다. 호스트의 IP 주소가 192.168.0.3이라고 할 때 네트워크의 게이트웨이는 192.168.0.1이 되기 때문에 1로 변경해주는 것이다. (이 경우 컨테이너가 호스트 IP를 공유해서 사용하기 때문에 변경하지 않아도 된다.)
network가 bridge라면 다음과 같이 설정해야 한다.

if DEBUG:
    def show_toolbar(request):
        return True
    
    
    DEBUG_TOOLBAR_CONFIG = {
        "SHOW_TOOLBAR_CALLBACK": show_toolbar,
    }
    hostname, _, ips = socket.gethostbyname_ex(socket.gethostname())
    INTERNAL_IPS = [".".join(ip.split(".")[:-1]) + ".1" for ip in ips]

보통 172.17.0.1이지만 docker-compose.yaml에서 다음 설정을 했기 때문에 도커 컨테이너는 호스트 IP를 사용한다.

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

django debug toolbar Refused to apply style from '<URL>' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled. 개발자 도구의 console을 확인해보면 다음과 같은 에러가 발생하고 UI가 이상하다.

정적 파일을 서빙해주는 whitenoise 패키지를 설치하고 몇가지 설정을 해줘야 한다.
pip install whitenoise or poetry add whitenoise

settings.py에서 "whitenoise.middleware.WhiteNoiseMiddleware" 추가

MIDDLEWARE = [
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",  # 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",
]

docker-compose -f docker-compose.local.yml up -d --build로 빌드 및 컨테이너 실행

결과

UI에서 아래 에러 나오면 INSTALLED_APPS에 rest_framework 추가
Django: TemplateDoesNotExist (rest_framework/api.html)

0개의 댓글