Django
디버깅
수색…
비고
Pdb
Pdb는 (Pdb) 프롬프트에서 globals()
또는 locals()
를 입력하여 globals()
또는 로컬 범위의 기존 변수를 모두 인쇄 할 수도 있습니다.
파이썬 디버거 (Pdb) 사용하기
가장 기본적인 Django 디버깅 도구는 Python 표준 라이브러리의 일부인 pdb 입니다.
초기화보기 스크립트
간단한 views.py
스크립트를 살펴 보자.
from django.http import HttpResponse
def index(request):
foo = 1
bar = 0
bug = foo/bar
return HttpResponse("%d goes here." % bug)
서버를 실행하는 콘솔 명령 :
python manage.py runserver
인덱스 페이지를로드하려고 시도 할 때 장고가 ZeroDivisionError
던지는 것은 명백합니다.하지만 코드에서 버그가 매우 심한 것처럼 보이면 정말 불쾌해질 수 있습니다.
중단 점 설정
다행히도, 우리는 버그를 추적하도록 중단 점 을 설정할 수 있습니다 :
from django.http import HttpResponse
# Pdb import
import pdb
def index(request):
foo = 1
bar = 0
# This is our new breakpoint
pdb.set_trace()
bug = foo/bar
return HttpResponse("%d goes here." % bug)
pdb를 사용하여 서버를 실행하는 콘솔 명령 :
python -m pdb manage.py runserver
이제 페이지로드 브레이크 포인트가 셸에서 (Pdb) 프롬프트를 트리거하고, 브라우저가 대기 상태가됩니다.
pdb 쉘로 디버깅하기
쉘을 통해 스크립트와 상호 작용하여 해당 뷰를 디버그 할 차례입니다.
> ../views.py(12)index()
-> bug = foo/bar
# input 'foo/bar' expression to see division results:
(Pdb) foo/bar
*** ZeroDivisionError: division by zero
# input variables names to check their values:
(Pdb) foo
1
(Pdb) bar
0
# 'bar' is a source of the problem, so if we set it's value > 0...
(Pdb) bar = 1
(Pdb) foo/bar
1.0
# exception gone, ask pdb to continue execution by typing 'c':
(Pdb) c
[03/Aug/2016 10:50:45] "GET / HTTP/1.1" 200 111
마지막 줄에서 우리는 우리의 견해가 OK
응답을 반환하고 꼭 실행해야한다는 것을 알 수 있습니다.
pdb 루프를 멈추려면 q
를 쉘에 입력하십시오.
장고 디버그 툴바 사용하기
먼저 django-debug-toolbar 를 설치해야합니다.
pip install django-debug-toolbar
settings.py :
그런 다음 프로젝트의 설치된 응용 프로그램에 포함 시키되 조심하십시오. 디버그 도구 모음과 같은 개발 전용 응용 프로그램 및 미들웨어에 다른 settings.py
파일을 사용하는 것이 좋습니다.
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware']
디버그 도구 모음도 정적 파일을 사용하므로 적절한 앱도 포함해야합니다.
INSTALLED_APPS = [
# ...
'django.contrib.staticfiles',
# ...
]
STATIC_URL = '/static/'
# If environment is dev...
DEBUG = True
INSTALLED_APPS += [
'debug_toolbar',
]
어떤 경우에는 settings.py
에서 INTERNAL_IPS
를 settings.py
.
INTERNAL_IPS = ('127.0.0.1', )
urls.py :
urls.py
에서는 공식 문서에서 알 수 있듯이 다음 스 니펫이 디버그 툴바 라우팅을 활성화해야합니다.
if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar
urlpatterns += [
url(r'^__debug__/', include(debug_toolbar.urls)),
]
설치 후 도구 모음의 정적 수집 :
python manage.py collectstatic
그게 바로 디버그 툴바가 프로젝트 페이지에 표시되어 실행 시간, SQL, 정적 파일, 신호 등에 대한 다양한 유용한 정보를 제공합니다.
HTML :
또한, django-debug-toolbar
는 적절히 렌더링하기 위해 text/html
, <html>
및 <body>
태그의 Content-type 을 필요로합니다.
모든 것을 올바르게 구성했지만 디버그 도구 모음이 여전히 렌더링되지 않은 경우이 "핵"솔루션 을 사용하여 파악하십시오.
"어설 션 거짓"사용
개발 중에 코드에 다음 행을 삽입하십시오.
assert False, value
django는이 라인이 실행될 때 오류 메시지로 제공된 값으로 AssertionError
를 발생시킵니다.
뷰 또는 뷰에서 호출 된 코드에서 DEBUG=True
로 설정하면 많은 디버깅 정보가 포함 된 전체 및 상세 스택 추적이 브라우저에 표시됩니다.
완료되면 라인을 삭제하는 것을 잊지 마십시오!
디버거를 사용하는 대신 문서, 테스트, 로깅 및 어설 션을 많이 작성하는 것을 고려하십시오.
디버깅에는 시간과 노력이 필요합니다.
디버거로 버그를 추적하는 대신 코드를 작성하는 데 더 많은 시간을 할애 해보십시오.
- 테스트를 작성하고 실행하십시오. Python과 Django는 디버거를 사용하여 직접 작성하는 것보다 훨씬 빠르게 코드를 테스트하는 데 사용할 수있는 훌륭한 기본 프레임 워크를 내장하고 있습니다.
- 함수, 클래스 및 모듈에 대한 적절한 문서 작성 PEP 257 과 Google의 Python Style Guide 는 훌륭한 문서 문자열 작성을위한 우수 사례를 제공합니다.
- 개발 중 및 배포 후 프로그램에서 출력을 생성 하려면 로깅 을 사용하십시오 .
- 중요한 장소에 코드에
assert
이온 을 추가 합니다. 모호성을 줄이고 문제가 발생하면이를 잡습니다.
보너스 : 문서와 테스트를 결합하기위한 doctest 를 작성하십시오!