[python] 장고에서 디버깅하는 좋은 방법? [닫은]
그래서 파이썬 과 나중에 장고 로 코딩하는 법을 배우기 시작했습니다 . 처음으로 역 추적을보기가 어려웠으며 실제로 내가 잘못한 것과 구문 오류가 발생한 위치를 알아 냈습니다. 어느 정도 시간이 지났고 어떤 방식 으로든 장고 코드를 디버깅하는 루틴이 있다고 생각합니다. 이것이 코딩 경험 초기에 이루어 졌을 때, 나는 앉아서 어떻게이 일이 효과적이지 않고 더 빨리 이루어질 수 있는지 궁금해했다. 일반적으로 코드에서 버그를 찾아서 수정하지만 더 빨리해야하는지 궁금합니다.
나는 보통 Django가 활성화되면 디버그 정보를 사용합니다. 내가 생각했던대로 일이 끝나면 구문 오류로 코드 흐름을 많이 깨뜨리고 흐름에서 해당 시점의 변수를보고 코드가 내가 원하는 것 이외의 것을 수행하는 위치를 찾습니다.
그러나 이것이 개선 될 수 있습니까? 장고 코드를 디버깅하는 좋은 도구 나 더 좋은 방법이 있습니까?
답변
여러 가지 방법이 있지만 가장 간단한 방법은 단순히 Python 디버거 를 사용하는 것 입니다. Django view 함수에 다음 줄을 추가하십시오.
import pdb; pdb.set_trace()
또는
breakpoint() #from Python3.7
브라우저에 해당 페이지를로드하려고하면 브라우저가 중단되고 실제 실행 코드를 디버깅하라는 메시지가 표시됩니다.
그러나 다른 옵션이 있습니다 (권장하지 않습니다).
* return HttpResponse({variable to inspect})
* print {variable to inspect}
* raise Exception({variable to inspect})
그러나 모든 유형의 Python 코드에는 Python Debugger (pdb)를 사용하는 것이 좋습니다. 이미 pdb 를 사용 하고 있다면 디버깅 을 위해 ipython 을 사용하는 IPDB 를 살펴보고 싶을 것 입니다.
pdb에 대한 더 유용한 확장은
Seafangs가 제안한 Django의 Python 디버거 사용 .
답변
Werkzeug 의 대화식 디버거를 정말 좋아 합니다. Django의 디버그 페이지와 비슷하지만 모든 레벨의 트레이스 백에서 대화식 쉘을 얻는다는 점이 다릅니다. django-extensions 를 사용하면 runserver_plus
개발 서버를 시작하고 예외에 대한 Werkzeug의 디버거를 제공 하는 관리 명령이 제공됩니다.
물론 브라우저를 사용하는 모든 사람에게 서버 컨텍스트에서 임의의 파이썬 코드를 실행할 수있는 권한을 제공하므로 로컬에서만 실행해야합니다.
답변
템플릿 태그에 대한 간단한 설명 :
@register.filter
def pdb(element):
import pdb; pdb.set_trace()
return element
이제 템플릿 내에서 마음의 내용을 {{ template_var|pdb }}
검사 할 수있는 pdb 세션 (로컬 개발 서버를 실행 한 경우)을 수행 하고 시작할 수 있습니다 element
.
개체가 템플릿에 도착했을 때 무슨 일이 있었는지 확인할 수있는 아주 좋은 방법입니다.
답변
잘 협력하여 디버깅 작업을보다 쉽게 수행 할 수있는 몇 가지 도구가 있습니다.
Django 디버그 툴바 가 가장 중요합니다 .
그런 다음 Python 로깅 기능을 사용하여 적절한 로깅이 필요합니다 . 로깅 출력을 로그 파일로 보낼 수 있지만 더 쉬운 옵션은 로그 출력을 firepython에 보내는 것 입니다. 이것을 사용하려면 Firefox 브라우저에 firebug 확장명 을 사용해야합니다 . Firepython에는 Firebug 탭에 서버 측 로깅을 표시하는 firebug 플러그인이 포함되어 있습니다.
Firebug 자체는 개발하는 모든 앱의 자바 스크립트 측면을 디버깅하는 데에도 중요합니다. (물론 JS 코드가 있다고 가정).
또한 pdb를 사용하여 대화식으로 뷰를 디버깅하기 위해 django-viewtools가 마음 에 들었지만 많이 사용하지는 않습니다.
메모리 누출을 추적하기 위해 도저와 같은 더 유용한 도구가 있습니다 (메모리 추적을 위해 SO에 대한 답변에 다른 좋은 제안이 있습니다).
답변
나는 PyCharm (일식과 동일한 pydev 엔진)을 사용합니다. 시각적으로 코드를 단계별로 살펴보고 무슨 일이 일어나고 있는지 확인할 수 있습니다.
답변
지금까지 거의 모든 것이 언급되었으므로 iPythonpdb.set_trace()
을 사용하는 ipdb.set_trace () 를 사용할 수 있으므로 더 강력합니다 (자동 완성 및 기타 장점). 이 작업에는 ipdb 패키지가 필요하므로pip install ipdb
답변
PyPI로 푸시 django-pdb
했습니다 . pdb에 침입하려고 할 때마다 소스 코드를 편집 할 필요가없는 간단한 앱입니다.
설치는 단지 …
pip install django-pdb
- 추가
'django_pdb'
로INSTALLED_APPS
이제 실행할 수 있습니다 : manage.py runserver --pdb
모든보기가 시작될 때 pdb에 침입하십시오 …
bash: manage.py runserver --pdb
Validating models...
0 errors found
Django version 1.3, using settings 'testproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
GET /
function "myview" in testapp/views.py:6
args: ()
kwargs: {}
> /Users/tom/github/django-pdb/testproject/testapp/views.py(7)myview()
-> a = 1
(Pdb)
manage.py test --pdb
테스트 실패 / 오류시 pdb에 침입 하려면 다음 을 실행하십시오 .
bash: manage.py test testapp --pdb
Creating test database for alias 'default'...
E
======================================================================
>>> test_error (testapp.tests.SimpleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File ".../django-pdb/testproject/testapp/tests.py", line 16, in test_error
one_plus_one = four
NameError: global name 'four' is not defined
======================================================================
> /Users/tom/github/django-pdb/testproject/testapp/tests.py(16)test_error()
-> one_plus_one = four
(Pdb)
이 프로젝트는 GitHub 에서 호스팅되며 , 기부금은 물론 환영합니다.