장고에서 디버깅하는 좋은 방법? [닫은]


587

그래서 파이썬 과 나중에 장고 로 코딩하는 법을 배우기 시작했습니다 . 처음으로 역 추적을보기가 어려웠으며 실제로 내가 잘못한 것과 구문 오류가 발생한 위치를 알아 냈습니다. 어느 정도 시간이 지났고 어떤 방식 으로든 장고 코드를 디버깅하는 루틴이 있다고 생각합니다. 이것이 코딩 경험 초기에 이루어 졌을 때, 나는 앉아서 어떻게이 일이 효과적이지 않고 더 빨리 이루어질 수 있는지 궁금해했다. 일반적으로 코드에서 버그를 찾아서 수정하지만 더 빨리해야하는지 궁금합니다.

나는 보통 Django가 활성화되면 디버그 정보를 사용합니다. 내가 생각했던대로 일이 끝나면 구문 오류로 코드 흐름을 많이 깨뜨리고 흐름에서 해당 시점의 변수를보고 코드가 내가 원하는 것 이외의 것을 수행하는 위치를 찾습니다.

그러나 이것이 개선 될 수 있습니까? 장고 코드를 디버깅하는 좋은 도구 나 더 좋은 방법이 있습니까?


2
django-debug-toolbar를 사용하는 것을 매우 좋아합니다
Diego Vinícius

1
또는 여기에 설명 된대로 Visual Studio Code의 내장 Python 디버거를 사용하십시오. code.visualstudio.com/docs/python/tutorial-django
Nick T

답변:


536

여러 가지 방법이 있지만 가장 간단한 방법은 단순히 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에 대한 더 유용한 확장은

pdb ++ , Antash 에서 제안했습니다.

pudb , PatDuJour 가 제안 .

Seafangs가 제안한 Django의 Python 디버거 사용 .


64
pdb 제안을위한 +1 그러나 콘솔에 프롬프트가 표시되므로 로컬 시스템에서 개발 서버를 사용할 때만 실제로 작동한다는 점은 주목할 가치가 있습니다.
Daniel Roseman

12
아래 답변에 따라 django-pdb 도 참조하십시오 . 당신 manage.py runserver --pdbmanage.py test --pdb명령을 제공 합니다.
톰 크리스티

4
@Daniel, 이미 실행중인 파이썬 인스턴스에 콘솔을 설치하려면 rconsole 을 참조하십시오 .
Phob

12
확인하십시오 ipython. Ipdb, ipython기능 탭 완성, 색상 구문 등 :-)과 함께 제공됩니다 .
hobbes3

3
귀하의 답변이 유용하다는 것을 알았지 만 테스트를 디버깅하려고 할 때 장고는 중단 점에 영원히 매달려있었습니다. 그래서 나는 도움이되는 유익한 기사를 보았습니다 .v3.mike.tig.as
blog

228

Werkzeug 의 대화식 디버거를 정말 좋아 합니다. Django의 디버그 페이지와 비슷하지만 모든 레벨의 트레이스 백에서 대화식 쉘을 얻는다는 점이 다릅니다. django-extensions 를 사용하면 runserver_plus개발 서버를 시작하고 예외에 대한 Werkzeug의 디버거를 제공 하는 관리 명령이 제공됩니다.

물론 브라우저를 사용하는 모든 사람에게 서버 컨텍스트에서 임의의 파이썬 코드를 실행할 수있는 권한을 제공하므로 로컬에서만 실행해야합니다.


2
브라우저에 표시된 대화식 콘솔에서 탭 완성 기능을 사용할 수 있습니까? "탭"은 우리를 다음 오픈 콘솔로 데려가는데, 키 조합이 있는지 궁금했지만, 찾지 못했습니다.
Ariel

@Ariel the werkzeug 디버거에는 탭 완성 기능이 없습니다.
Håken Lid

API를 디버깅하는 경우 Werkzeug 디버거에 약간의 왜곡을 추가하는 django-rundbg 를 사용해 볼 수 있습니다.
elpaquete

그것은 단지python 3.3
Timo


166

템플릿 태그에 대한 간단한 설명 :

@register.filter 
def pdb(element):
    import pdb; pdb.set_trace()
    return element

이제 템플릿 내에서 마음의 내용을 {{ template_var|pdb }}검사 할 수있는 pdb 세션 (로컬 개발 서버를 실행 한 경우)을 수행 하고 시작할 수 있습니다 element.

개체가 템플릿에 도착했을 때 무슨 일이 있었는지 확인할 수있는 아주 좋은 방법입니다.


1
이것은 대단하다. 템플릿 문제가있는 경우 할 수있는 또 다른 일은 jinja2 (관을 통해로드)로 전환하는 것입니다-django 템플릿의 확장이므로 내 의견이 향상되었습니다. 또한 django보다 템플릿 및 템플릿 상속을 트레이스 백 프레임에 통합합니다.
빠른 곱셈

사랑 스럽습니다. 불행히도, pdb 가져 오기를 포함한 커밋을 거부하는 코드베이스에 이것을 통합하는 명확한 방법을 찾기는 어렵습니다.
Jon Kiparsky

83

잘 협력하여 디버깅 작업을보다 쉽게 ​​수행 할 수있는 몇 가지 도구가 있습니다.

Django 디버그 툴바 가 가장 중요합니다 .

그런 다음 Python 로깅 기능을 사용하여 적절한 로깅이 필요합니다 . 로깅 출력을 로그 파일로 보낼 수 있지만 더 쉬운 옵션은 로그 출력을 firepython에 보내는 입니다. 이것을 사용하려면 Firefox 브라우저에 firebug 확장명 을 사용해야합니다 . Firepython에는 Firebug 탭에 서버 측 로깅을 표시하는 firebug 플러그인이 포함되어 있습니다.

Firebug 자체는 개발하는 모든 앱의 자바 스크립트 측면을 디버깅하는 데에도 중요합니다. (물론 JS 코드가 있다고 가정).

또한 pdb를 사용하여 대화식으로 뷰를 디버깅하기 위해 django-viewtools가 마음 에 들었지만 많이 사용하지는 않습니다.

메모리 누출을 추적하기 위해 도저와 같은 더 유용한 도구가 있습니다 (메모리 추적을 위해 SO에 대한 답변에 다른 좋은 제안이 있습니다).


65

나는 PyCharm (일식과 동일한 pydev 엔진)을 사용합니다. 시각적으로 코드를 단계별로 살펴보고 무슨 일이 일어나고 있는지 확인할 수 있습니다.


2
가장 좋은 점은 작동하고 완전히 직관적이라는 것입니다. 라인의 왼쪽을 클릭하고 디버그 버튼을 누르십시오. 내부 코드의 작동 방식을 더 잘 이해하려면 장고 소스 코드에서도 잘 작동합니다. 눈치 채기까지 시간이 조금 걸렸지 만 파일 탐색기의 외부 라이브러리 폴더에있는 코드에 중단 점을 넣을 수 있습니다.
Michael Bylstra

6
PyCharm은 크레딧을 위해 PyDev 디버거를 사용합니다.
Medeiros


44

지금까지 거의 모든 것이 언급되었으므로 iPythonpdb.set_trace() 을 사용하는 ipdb.set_trace () 를 사용할 수 있으므로 더 강력합니다 (자동 완성 및 기타 장점). 이 작업에는 ipdb 패키지가 필요하므로pip install ipdb


2
매우 유용한 고정 모드를 제공하는 pdb ++를 권장합니다.
Sandeep

34

PyPI로 푸시 django-pdb했습니다 . pdb에 침입하려고 할 때마다 소스 코드를 편집 할 필요가없는 간단한 앱입니다.

설치는 단지 ...

  1. pip install django-pdb
  2. 추가 '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 에서 호스팅되며 , 기부금은 물론 환영합니다.


3
뷰뿐만 아니라 파일 / 줄 번호를 지정할 수 있다면 좋을 것입니다.
Anson MacKeracher

주석은 프로덕션 내에서 비활성 인 것처럼 코드에 남길 수 있습니다. 아마도 이것은 나쁜 패러다임이지만, 윌리-닐리를 효과적으로 제거하고 적용하는 것이 좋을 것입니다.
글리세린

최근에 이것을 설치했지만 Tom의 django-pdb가 문서화 한 것처럼 오늘만 내 설정에서 "POST_MORTEM = True"를 구성하는 것으로 나타났습니다. 이제 나는 순항을 할 수 있고 상황이 나빠질 때 문제의 위치로 바로 떨어졌습니다. 고마워 톰!
Joseph Sheedy

21

파이썬을 디버깅하는 가장 쉬운 방법은, 특히 Visual Studio에 사용되는 프로그래머의 경우 PTVS (Python Tools for Visual Studio)를 사용하는 것입니다. 단계는 간단합니다.

  1. http://pytools.codeplex.com/ 에서 다운로드하여 설치 하십시오.
  2. 중단 점을 설정하고 F5를 누르십시오.
  3. 중단 점에 도달하면 C # / C ++ 프로그램을 디버깅하는 것만 큼 쉽게 변수를 보거나 변경할 수 있습니다.
  4. 그게 다야 :)

PTVS를 사용하여 Django를 디버깅하려면 다음을 수행해야합니다.

  1. 프로젝트 설정-일반 탭에서 "시작 파일"을 Django 프로그램의 진입 점 인 "manage.py"로 설정하십시오.
  2. 프로젝트 설정-디버그 탭에서 "스크립트 인수"를 "runserver --noreload"로 설정하십시오. 핵심은 여기서 "--noreload"입니다. 설정하지 않으면 중단 점이 적중되지 않습니다.
  3. 즐기세요.

1
고마워요. --noreload는 우리가 필요로하는 것입니다
Tom Gruner

원격 서버에서 디버깅하는 기능이 있습니까? 현재 사용하고있는 Eclipse PyDev와 비슷합니까?
Daniel Sokolowski

이 문제가 있습니다. 나는 당신의 단계를 따랐지만 여전히 작동하지 않습니다. * .html 파일이 아닌 * .py 파일의 중단 점에서만 중지됩니다.
blfuentes

16

나는 Eclipse와 함께 pyDev 를 정말 잘 사용하고, 중단 점을 설정하고, 코드로 들어가고, 모든 객체와 변수에 대한 값을보고, 시험해보십시오.


노력이 적은 디버깅 환경을 위해 Eclipse를 통해 dev 서버를 실행해야합니다. PyDev는 원격 디버깅을 주장하지만 결코 사용하지는 않았지만 실제로 개발 경험의 품질에 대해 말할 수는 없습니다. 세부 : pydev.org/manual_adv_remote_debugger.html
synthesizerpatel

2
PyDev의 원격 디버거는 Django의 dev 서버와 매우 훌륭하게 작동합니다. "파일이 변경되면 자동으로 모듈을 다시로드 하시겠습니까?" PyDev의 Run / Debug 설정에서 ''disabled ''옵션을 선택하십시오. 그렇지 않으면 dev 서버와 pydev는 디버깅하는 동안 코드를 다시로드하려고 시도하여 매우 혼란 스럽습니다.
coredumperror 2018 년

12

나는 PyCharm을 사용 하고 끝까지 기다 립니다. 그것은 약간의 비용이 들었지만, 내가 얻는 이점은 귀중합니다. 콘솔에서 디버깅을 시도했는데 사람들이 그렇게 할 수있는 많은 신용을 얻었지만 시각적으로 응용 프로그램을 디버깅 할 수 있다는 것은 훌륭합니다.

그래도 PyCharm 은 많은 메모리를 사용합니다. 그러나 다시, 인생에서 선한 것은 없습니다. 방금 최신 버전 3을 제공했습니다. 또한 Django, Flask 및 Google AppEngine 과도 잘 작동합니다. 모든 개발자에게 유용한 도구라고 할 수 있습니다.

아직 사용하지 않는 경우 PyCharm의 힘을 살펴보기 위해 30 일 동안 시험판을 사용하는 것이 좋습니다. Aptana와 같은 다른 도구도 사용할 수 있습니다. 그러나 나는 PyCharm이 보이는 방식을 좋아한다고 생각합니다. 거기에서 내 앱을 디버깅하는 것이 매우 편안합니다.


내가 구입 한 첫 번째 IDE가 될 수 있습니다. VM에서 프로젝트를 디버깅하는 것은 비용이 많이 드는 마술처럼 들립니다.
Rob Grant

10

때로는 특정 방법으로 탐색하고 pdb 소환이 너무 번거로울 때 다음을 추가합니다.

import IPython; IPython.embed()

IPython.embed() 호출 한 지점에서 로컬 변수에 액세스 할 수있는 IPython 쉘을 시작합니다.


파일 상단 에서이 작업을 수행 한 다음 습관적으로 from IPython import embed코드에 중단 점을 빠르게 추가하려고 할 때마다 작성 embed()합니다. 시간을 절약합니다. 영원히 루프에 갇히지 않도록하기 위해, 나는 할embed();exit();
Mayank Jaiswal

@MayankJaiswal :이 조각 (와 유사한 조각 삽입하는 빔의 키 매핑했다 pudb그리고 debugger;내가 편집있어 파일에 자바 스크립트를). 완료 후 dd중단 점을 제거하기 위해 (전체 줄 삭제). 이렇게하면 디버거 가져 오기 행을 버전 제어로 커밋하거나 파일 맨 먼저 가져 오기를 사전 설정해야 할 위험이 없습니다.
거짓말 라이언

10

내 관점에서 일반적인 코드 디버깅 작업을 세 가지 사용 패턴으로 나눌 수 있습니다.

  1. 뭔가 예외발생했습니다 : runserver_plus 'Werkzeug 디버거가 구조되었습니다. 모든 추적 수준에서 사용자 지정 코드를 실행할 수있는 기능이 가장 중요합니다. 그리고 당신이 완전히 붙어 있다면, 클릭 한 번으로 공유 할 요점을 만들 수 있습니다.
  2. 페이지가 렌더링되지만 결과가 잘못되었습니다 . 다시 Werkzeug가 흔들립니다. 코드에서 중단 점을 만들 assert False려면 중지하려는 위치를 입력 하십시오.
  3. 코드가 잘못 작동 하지만 빠른 모양으로는 도움이되지 않습니다. 아마도 알고리즘 문제 일 것입니다. 한숨. 그리고 나는 보통 디버거 콘솔 불 PuDB을 : import pudb; pudb.set_trace(). [i] pdb의 주요 장점은 PuDB (80 년대를 보면서)가 사용자 정의 시계 표현을 쉽게 설정한다는 것입니다. 또한 GUI를 사용하면 여러 개의 중첩 루프를 디버깅하는 것이 훨씬 간단합니다.

아, 그렇습니다. 가장 일반적인 (나와 동료에게) 문제는 잘못된 컨텍스트입니다. 변수가 없거나 변수에 속성이 없습니다. 디버그 도구 모음을 사용 하는 경우 "템플릿"섹션에서 컨텍스트를 검사하거나 충분하지 않은 경우 컨텍스트가 채워진 직후에 뷰 코드를 중단하십시오.

그렇습니다.


그냥 사용하여 덜 입력import pudb;pu.db
Sławomir Lenart

6

epdb (Extended Python Debugger)를 적극 권장합니다.

https://bitbucket.org/dugan/epdb

Django 또는 다른 Python 웹 서버를 디버깅하기 위해 epdb에 대해 좋아하는 것은 epdb.serve () 명령입니다. 추적을 설정하고 연결할 수있는 로컬 포트에서이를 제공합니다. 일반적인 사용 사례 :

단계별로 진행하고 싶은 견해가 있습니다. 추적을 설정하려는 지점에 다음을 삽입합니다.

import epdb; epdb.serve()

이 코드가 실행되면 Python 인터프리터를 열고 서빙 인스턴스에 연결합니다. 모든 값을 분석하고 n, s 등과 같은 표준 pdb 명령을 사용하여 코드를 단계별로 볼 수 있습니다.

In [2]: import epdb; epdb.connect()
(Epdb) request
<WSGIRequest
path:/foo,
GET:<QueryDict: {}>, 
POST:<QuestDict: {}>,
...
>
(Epdb) request.session.session_key
'i31kq7lljj3up5v7hbw9cff0rga2vlq5'
(Epdb) list
 85         raise some_error.CustomError()
 86 
 87     # Example login view
 88     def login(request, username, password):
 89         import epdb; epdb.serve()
 90  ->     return my_login_method(username, password)
 91
 92     # Example view to show session key
 93     def get_session_key(request):
 94         return request.session.session_key
 95

그리고 언제든지 epdb 도움말을 입력하는 방법을 배울 수 있습니다.

여러 epdb 인스턴스를 동시에 제공하거나 연결하려는 경우 수신 할 포트를 지정할 수 있습니다 (기본값은 8080). 즉

import epdb; epdb.serve(4242)

>> import epdb; epdb.connect(host='192.168.3.2', port=4242)

지정하지 않으면 호스트의 기본값은 'localhost'입니다. 로컬 LAN의 개발 서버와 같은 로컬 인스턴스 이외의 것을 디버깅하는 데 이것을 사용하는 방법을 보여주기 위해 여기에 던졌습니다. 분명히 이렇게하면 세트 추적이 프로덕션 서버에서 절대로 발생하지 않도록주의하십시오!

빠른 참고로, epdb ( import epdb; epdb.set_trace()) 를 사용하여 허용 된 답변과 동일한 작업을 수행 할 수는 있지만 제공 기능을 강조하고 싶었습니다.


epdb는 2011 년 이후로 업데이트되지 않았습니다. 최신 버전의 Django 및 / 또는 Python에서이를 사용하는 데 문제가 있습니까?
Seperman

나는 파이썬 2 (특히 2.4-2.7)에 대해 그것을 사용하는 데 결코 문제가 없었습니다. 사실 며칠 전에 사용했습니다. 나는 파이썬 3을 사용해 본 적이 없다.
Jacinda

1
파이썬 2.7에서 django 1.8을 실행 중이며 epdb.connect와 epdb.serve와 통신 할 수 없습니다. 시간 초과가 발생했습니다.
David Watson

6

방금 wdb를 찾았습니다 ( http://www.rkblog.rk.edu.pl/w/p/debugging-python-code-browser-wdb-debugger/?goback=%2Egde_25827_member_255996401 ). 그것은 모든 종과 휘파람이있는 꽤 멋진 사용자 인터페이스 / GUI를 가지고 있습니다. 저자는 wdb에 대해 이것을 말합니다-

"PyCharm과 같은 IDE에는 자체 디버거가 있습니다. 유사하거나 동등한 기능 세트를 제공합니다. 그러나이를 사용하려면 특정 IDE를 사용해야합니다 (일부는 비공 용적이거나 일부는 사용할 수 없습니다) "필요한 도구를 선택하십시오."

내가 그냥 전달할 줄 알았는데

파이썬 디버거에 대한 매우 유용한 기사 : https://zapier.com/engineering/debugging-python-boss/

마지막으로 Django에서 콜 스택의 멋진 그래픽 출력을 보려면 https://github.com/joerick/pyinstrument를 확인 하십시오 . MIDDLEWARE_CLASSES에 pyinstrument.middleware.ProfilerMiddleware를 추가 한 다음 요청 URL 끝에? profile을 추가하여 프로파일 러를 활성화하십시오.

명령 행에서 또는 모듈로 가져 와서 pyinstrument를 실행할 수도 있습니다.


PyCharm은 PyDev를 사용합니다.
Rob Grant

6

파이썬 코드의 해당 줄에 import pdb; pdb.set_trace()또는 breakpoint() (python3.7 양식) 을 추가 하고 실행하십시오. 대화식 쉘로 실행이 중지됩니다. 쉘에서 파이썬 코드 (예 : 인쇄 변수)를 실행하거나 다음과 같은 명령을 사용할 수 있습니다.

  • c 계속 실행
  • n 동일한 기능 내에서 다음 줄로 이동
  • s 이 함수 또는 호출 된 함수의 다음 줄로 이동
  • q 디버거 / 실행을 종료

참조 : https://poweruser.blog/setting-a-breakpoint-in-python-438e23fe6b28


5

Django 코드를 디버깅하는 가장 좋은 방법 중 하나는 wdb를 사용하는 것입니다 : https://github.com/Kozea/wdb

wdb는 python 2 (2.6, 2.7), python 3 (3.2, 3.3, 3.4, 3.5) 및 pypy와 함께 작동합니다. 더 좋은 방법은, python 3에서 실행되는 wdb 서버로 python 2 프로그램을 디버깅하거나 그 반대로 또는 세 번째 컴퓨터의 웹 페이지 내 다른 컴퓨터에서 실행되는 디버깅 서버로 컴퓨터에서 실행되는 프로그램을 디버깅하는 것이 가능합니다! 더 나은 점은 이제 웹 인터페이스에서 코드 삽입을 사용하여 현재 실행중인 Python 프로세스 / 스레드를 일시 중지 할 수 있습니다. (gdb 및 ptrace를 활성화해야합니다.) 다시 말해 멋진 기능을 갖춘 브라우저에서 직접 pdb의 매우 향상된 버전입니다.

서버를 설치하고 실행하고 코드에 다음을 추가하십시오.

import wdb
wdb.set_trace()

저자에 따르면, 주요 차이점 pdb은 다음과 같습니다.

프로젝트를 모르는 사람들을 위해 wdb는 pdb와 같은 파이썬 디버거이지만 매끄러운 웹 프론트 엔드 및 다음과 같은 많은 추가 기능이 있습니다.

  • 소스 구문 강조
  • 시각적 중단 점
  • jedi를 사용한 대화식 코드 완성
  • 지속적인 중단 점
  • 마우스를 이용한 심도 검사 멀티 스레딩 / 멀티 프로세싱 지원
  • 원격 디버깅
  • 시계 표현
  • 디버거 코드 에디션
  • 오류 발생시 인기있는 웹 서버 통합
  • 예를 들어 werkzeug 디버거와 달리 추적 (사후 아님) 중에 예외가 발생하는 경우
  • 코드 주입을 통해 현재 실행중인 프로그램 중단 (지원되는 시스템에서)

훌륭한 브라우저 기반 사용자 인터페이스가 있습니다. 사용하는 기쁨! :)


pdb와의 차이점은 무엇입니까?
Dunatotatos

4

내가 사용 PyCharm 다른 디버그 도구를. 또한 초보자를 위해 쉽게 설정할 수있는 멋진 기사도 있습니다. 여기서 시작할 수 있습니다. Django 프로젝트에서 일반적으로 PDB 및 GUI 디버깅에 대해 알려줍니다. 누군가가 그들에게 도움이되기를 바랍니다.



2

대부분의 옵션은 이미 언급되어 있습니다. 템플릿 컨텍스트를 인쇄하기 위해 간단한 라이브러리를 만들었습니다. https://github.com/edoburu/django-debugtools를 참조 하십시오

{% load %}구성 없이 템플릿 컨텍스트를 인쇄하는 데 사용할 수 있습니다 .

{% print var %}   prints variable
{% print %}       prints all

사용자 정의 된 pprint 형식을 사용하여 변수를 <pre>태그 에 표시합니다 .


2

Visual Studio Code가 Django 앱을 디버깅하는 데 훌륭하다는 것을 알았습니다. 표준 python launch.json 매개 변수 python manage.py는 디버거가 연결된 상태로 실행 되므로 중단 점을 설정하고 원하는대로 코드를 단계별로 실행할 수 있습니다.


2

실수로 pdb를 라이브 커밋에 추가 할 수있는 사람들을 위해 #Koobz 답변의 확장을 제안 할 수 있습니다.

@register.filter 
def pdb(element):
    from django.conf import settings
    if settings.DEBUG:    
        import pdb
        pdb.set_trace()
    return element

2

내 경험으로는 두 가지 방법이 있습니다.

  1. pdb를 좋아하는 향상된 디버거 인 ipdb를 사용 하십시오 .

    import ipdb;ipdb.set_trace()또는 breakpoint() (python3.7에서)

  2. django shell을 사용하고 아래 명령을 사용하십시오. 새 뷰를 개발할 때 매우 유용합니다.

    python manage.py shell



1

다른 게시물에서 언급했듯이-코드에서 중단 점을 설정하고 코드를 통해 걷는 것이 예상대로 작동하는지 확인하면 장고와 같은 것을 배우는 것이 좋은 방법이 될 때까지 장고와 같은 것을 배우는 좋은 방법입니다. 하고있다.

이렇게하려면 WingIde를 사용하는 것이 좋습니다. 언급 된 다른 IDE와 마찬가지로 사용하기 쉽고 레이아웃도 좋고 중단 점을 쉽게 설정할 수 있습니다. 스택을 평가 / 수정하는 등의 작업을 수행 할 때 코드가 수행하는 작업을 시각화하는 데 적합합니다. 나는 그것의 큰 팬입니다.

또한 PyCharm을 사용합니다. 우수한 정적 코드 분석 기능이 있으며 문제가 있음을 깨닫기 전에 문제를 발견하는 데 도움이 될 수 있습니다.

이미 언급 한 바와 같이 장고 디버그 도구 모음이 필수적이다 - https://github.com/django-debug-toolbar/django-debug-toolbar

그리고 디버그 또는 분석 도구를 명시 적으로 지정하지는 않지만 Django Snippets의 https://djangosnippets.org/snippets/290/ 에서 제공 하는 SQL Printing Middleware 가 가장 좋아합니다.

뷰가 생성 한 SQL 쿼리가 표시됩니다. 이를 통해 ORM이 수행하는 작업과 쿼리가 효율적이거나 코드를 재 작업해야하는 경우 (또는 캐싱 추가)에 대해 이해할 수 있습니다.

내 응용 프로그램을 개발하고 디버깅하는 동안 쿼리 성능을 주시하는 것이 매우 중요합니다.

다른 팁 하나-SQL 문이 아닌 요약 만 표시하기 위해 내 용도로 약간 수정했습니다 .... 그래서 개발하고 테스트하는 동안 항상 사용합니다. 또한 len (connection.queries)가 사전 정의 된 임계 값보다 큰 경우 추가 경고가 표시된다고 덧붙였습니다.

그런 다음 (성능 또는 쿼리 수 관점에서) 잘못된 것을 발견하면 SQL 문의 전체 표시를 다시 켜서 정확히 무슨 일이 일어나고 있는지 볼 수 있습니다. 여러 개발자와 함께 대규모 Django 프로젝트를 작업 할 때 매우 편리합니다.


1

pdb또는을 사용하십시오 ipdb. 이 두 가지 차이점은 ipdb가 자동 완성을 지원한다는 것입니다.

pdb 용

import pdb
pdb.set_trace()

ipdb 용

import ipdb
ipdb.set_trace()

줄 바꿈 n키 를 실행하려면 계속 c키를 누르십시오. 를 사용하여 더 많은 옵션을 확인하십시오help(pdb)


0

추가 제안.

당신이 활용할 수 nosetestsPDB를 오히려 주입 함께 pdb.set_trace()수동으로보기에. 장점은 오류가 처음 시작될 때 잠재적으로 타사 코드에서 오류 조건을 관찰 할 수 있다는 것입니다.

오늘 나에게 오류가 있습니다.

TypeError at /db/hcm91dmo/catalog/records/

render_option() argument after * must be a sequence, not int

....


Error during template rendering

In template /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/crispy_forms/templates/bootstrap3/field.html, error at line 28
render_option() argument after * must be a sequence, not int
18  
19          {% if field|is_checkboxselectmultiple %}
20              {% include 'bootstrap3/layout/checkboxselectmultiple.html' %}
21          {% endif %}
22  
23          {% if field|is_radioselect %}
24              {% include 'bootstrap3/layout/radioselect.html' %}
25          {% endif %}
26  
27          {% if not field|is_checkboxselectmultiple and not field|is_radioselect %}
28  

      {% if field|is_checkbox and form_show_labels %}

이제 이것이 폼의 생성자를 훼손했으며 어떤 필드가 문제인지 잘 알고 있습니다. 그러나 pdb를 사용 하여 템플릿 내에서 싱싱한 양식에 대해 불만을 제기 할 수 있습니까?

예, 저는 할수 있습니다. nosetests 에서 --pdb 옵션 사용 :

tests$ nosetests test_urls_catalog.py --pdb

예외를 정상적으로 처리하자마자 pdb는 예외가 발생하는 곳을 멈추고 둘러 볼 수 있습니다.

  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 537, in __str__
    return self.as_widget()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/forms.py", line 593, in as_widget
    return force_text(widget.render(name, self.value(), attrs=attrs))
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 513, in render
    options = self.render_options(choices, [value])
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py", line 543, in render_options
    output.append(self.render_option(selected_choices, *option))
TypeError: render_option() argument after * must be a sequence, not int
INFO lib.capture_middleware log write_to_index(http://localhost:8082/db/hcm91dmo/catalog/records.html)
INFO lib.capture_middleware log write_to_index:end
> /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/forms/widgets.py(543)render_options()
-> output.append(self.render_option(selected_choices, *option))
(Pdb) import pprint
(Pdb) pprint.PrettyPrinter(indent=4).pprint(self)
<django.forms.widgets.Select object at 0x115fe7d10>
(Pdb) pprint.PrettyPrinter(indent=4).pprint(vars(self))
{   'attrs': {   'class': 'select form-control'},
    'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]],
    'is_required': False}
(Pdb)         

파삭 파삭 한 필드 생성자에 대한 나의 선택 논증은 목록 / 튜플의 목록이 아니라 목록 내의 목록 이었음이 분명합니다.

 'choices': [[('_', 'any type'), (7, (7, 'type 7', 'RECTYPE_TABLE'))]]

깔끔한 것은이 pdb가 내 코드가 아닌 크리스피 코드 내에서 발생하고 수동으로 삽입 할 필요가 없다는 것입니다.


0

개발 중 빠른 추가

assert False, value

디버거를 사용할 필요없이 뷰 또는 다른 곳에서 문제를 진단하는 데 도움이 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.