Skip to content

Latest commit

 

History

History
119 lines (74 loc) · 4.73 KB

35.md

File metadata and controls

119 lines (74 loc) · 4.73 KB

The Art of Debugging

35.1 Debugging in Development

35.1.1 Use django-debug-toolbar

django-debug-toolbar django-silk

request와 response를 분석해줘서 디버깅에 필요한 정보를 제공해준다.

35.1.2 That Annoying CBV Error

CBV를 쓰면 다음과 같은 오류가 나올 때가 있다.

Internal Server Error: /
Traceback (most recent call last):
     File, "/.envs/oc/lib/python.7/site-packages/django/core/handlers/base.py", line 132, in get_response response =, wrapped_callback(request, *callback_args, **callback_kwargs)
    File, "/.envs/oc/lib/python.7/site-packages/django/utils/decorators.py",
        line 145, in inner
    return func(*args, **kwargs)
TypeError: __init__() takes exactly 1 argument (2 given)

장고에 대한 모든 에러가 함께 나오기 때문에 분석하기 어려울 수 있는데, 이럴 때는 urls.py 파일을 확인해보면 된다.

 path('',  HomePageView, name='home'),

다음과 같이 코드가 짜져있을 것이다.

 path('',  HomePageView.as_view(), name='home'),

as_view()를 추가해주면 된다.

35.1.3 Master the Python Debugger

다음과 같은 상황에서 사용하면 좋다.

  1. 테스트 케이스 안에서
  2. HTTP 요청을 받았을 때
  3. 장고 커맨드를 디버깅할 때

![NOTE] production에 배포할 때 pdb breakpoints를 남겨두면 안된다.

ipdb를 사용하면 ipython shell에서 디버깅을 할 수 있다.

35.1.4 Remember the Essentials for Form File Uploads

35.1.5 Lean on the Text Editor or IDE

Sublime Text, Textmates, Vim, Emacs 등의 텍스트 편집기를 사용할 때는 Python 및 Django 전용 옵션이나 플러그인을 찾아서 사용해라. 코드를 강조 표시하고 PEP-8 위반 사항을 식별하는 기능만 있어도 큰 도움이 된다.

IDE를 최대한 활용하지 않는다면 IDE 세팅하는 수고를 왜 하는지?

35.2 Debugging in Production

35.2.1 Read the Logs the Easy Way

Log를 전체 다 읽는 것보다 Sentry 같은 log aggregation service를 사용하는 것이 좋다.

35.2.2 Mirroring Production

Production의 환경을 최대한 똑같이 만들어서 디버깅하는 것이 좋다. 다음과 같은 부분을 확인해야 한다.

  1. 방화벽 또는 기타 보호 조치 뒤에 프로덕션 환경과 동일한 원격 서버를 설정한다.
  2. 개인 식별 정보를 제거하도록 각별히 주의하면서 프로덕션 데이터를 복사한다. 여기서 개인 식별 정보란 이메일 주소를 포함하여 개별 사용자의 중요한 세부 정보를 식별하는 데 사용될 수 있는 모든 것을 의미한다.

제품 외부(예: 방화벽 뒤)에서 프로덕션 미러에 완전히 액세스할 수 없는 경우 설정.DEBUG를 True로 변경하는 것도 고려할 수 있다.

35.2.3 UserBasedExceptionMiddleware

Superuser에게 500 에러시 디버깅 정보를 보여주는 middleware가 있다.

다음과 같이 사용할 수 있다.

Note

Example 35.7: UserBasedExceptionMiddleware

# core/middleware.py
import sys
from django.views.debug import technical_500_response

class UserBasedExceptionMiddleware:
    def process_exception(self, request, exception):
        if request.user.is_superuser:
            return technical_500_response(request, *sys.exc_info())

35.2.4 That Troublesome settings.ALLOWED_HOSTS Error

ALLOWED_HOSTS 설정은 Django 사이트에서 제공할 수 있는 호스트/도메인 이름을 나타내는 문자열 목록이다. settings.DEBUG가 True일 때 기본값이 ['localhost', '127.0.0.1', '[::1]']로 설정된다. 그래서 개발 환경에서는 문제 없이 작동한다. 하지만 settings.DEBUG가 False로 설정되면 ALLOWED_HOSTS는 기본적으로 빈 목록으로 설정된다. 빈 ALLOWED_HOSTS 및 settings.DEBUG가 True로 설정된 상태에서는 Django가 시작되지 않는다. 로그를 확인하면 CommandError 오류가 발생하고 있음을 알 수 있다.

ALLOWED_HOSTS를 작성하는 것을 절대 까먹지 마라

35.3 Feature Flags

Feature flag는 기능을 켜고 끌 수 있는 기능이다. 특정 유저에게만 특정 기능을 제공하고 싶거나 먼저 테스트해보고 싶을 때 사용할 수 있다.

35.3.1 Feature Flag Package

django-waffle

django-waffle는 feature flag를 구현하는 패키지이다.

35.3.2 Unit Testing Code Affected by Feature Flags

Feature flag가 적용된 기능을 Unit Test할 때는 켜져있는 경우와 아닌 경우 모두 테스트해야한다.