본문 바로가기
개발환경

Debugging Django in VScode

by wiggleji 2022. 4. 24.

Uyuni, Bolivia

 

Python 개발을 위한 다양한 IDE 가 존재하지만, 통상적으로 JetBrain의 PyCharm 을 많이 사용한다. 나 또한 몇 년간 애용했지만, License 갱신 이슈와 한정된 Plugin 으로 VSCode 를 사용하기 시작했다.

 

간단히, VSCode의 장점 3가지
1. 실무 프로젝트 작업시 좀 더 부드럽게 작업가능 (속도가 훨씬 빠름)
2. 다양한 Plugin (다른 언어도 개발 가능)
3. 무료 & Github 연동 가능

 

이번 글에는 Python Django 프로젝트와 디버깅 세팅에 대해 다룬다.

VScode 공식문서에도 설명이 잘 되어 있지만, 직접 구성해본 경험을 바탕으로 가능한 간편하게 설명해보겠다.

링크: https://code.visualstudio.com/docs/python/tutorial-django

개발환경
Python 3.9.4
django 4.0
djangorestframework 3.13.1

 

# 패키지 설치
pip install django
pip install djangorestframework

테스트용 view로 health_check 를 만들고,

# test_project/views.py
from django.http import HttpResponse

def health_check(request):
    number = 10
    number += 10
    return HttpResponse(status=200)
    

# test_project.urls.py
from django.contrib import admin
from django.urls import include, path
from django_debug.views import health_check

urlpatterns = [
    path('admin/', admin.site.urls),
    path('health_check/', health_check)
]

위 코드에서 number 에 20이 할당되는지와 health_check 에서 HTTP 200 코드를 반환하는지 확인하면 성공.

디버그 탭에서 Run and Debug로 환경설정
당연하게도 Python
Django 선택
바로 실행된다. 간단하다

health_check 에 breakpoint를 찍어주고 실행한 후, 브라우저로 localhost:8000/health_check/ 로 요청을 보내주면 Python debugger에서 값을 확인할 수 있다.

 

number의 20 값 확인
HealthCheck 성공 (status code 200)

성공 🙌


Add-on (1) 디버깅 개발환경 분리

추가로, Django 배포 시, production/develop 서버로 나누어 운영할 때 디버깅 환경을 나누어보자. 매우 쉽다.

Django의 기본설정값은 project/settings.py 를 사용하지만, 운영환경을 나누어 디버깅을 해보자.

# base.py (production)
# 기존 settings.py 대신 사용
...
BASE_VARIABLE = 'this is base'


# dev.py (develop)
from project.settings.base import *
# base 의 설정값 상속
DEV_VARIABLE = 'this is dev'

설정 파일을 2개로 구성하여, 테스트해보자.

base.py & dev.py

디버깅 환경 구성은 마찬가지로 디버깅 탭에서 create a launch.json file 을 눌러 Python -> Django 환경을 만들자.

create a launch.json file -> Python

Django

그러면, .vscode/launch.json 파일이 생기고, 아래와 같이 설정값이 생긴다.

{
    "version": "0.2.0",
    "configurations": [
    {
        "name": "Python: Django",
        "type": "python",
        "request": "launch",
        "program": "${workspaceFolder}/manage.py",
        "args": [
            "runserver",
            "--settings=project.settings.base"  <- 이부분을 추가
        ],
        "django": true
    }
    ]
}

Django에서 runserver 기준으로 setting 값을 지정하는 경우, 아래와 같이 setting_file 을 지정해주는데, settings에 대한 명시를 위의 args 에 추가하면 된다.

python manage.py runserver --settings=settings.setting_file

그럼 위에서 설정한 base  dev 의 차이를 비교해보자. 참고로, 환경을 2개 구성하였기 때문에 launch.json 은 아래처럼 되어있다.

base 와 dev 로 나누어 구성
base 환경에서는 dev.DEV_VARIABLE 참조 불가
dev 환경에서는 base.BASE_VARIABLE & dev.DEV_VARIABLE 참조 가능

보통 AWS Secret Manager를 사용하여 환경변수를 넣는 작업에서 값을 헷갈리는 경우가 발생하는데, 위와 같이 로컬에서 미리 나누어 작업하면 보다 수월하게 작업이 가능하다. 너무 쉽다.


Add-on (2) Django Test 환경 설정

로컬에서 Django test를 쓰는 경우도 마찬가지이다. Python의 unittest 혹은 pytest 를 많이 사용하는데, VScode에서 설정해보자.

Django에서 기본적으로 unittest 를 지원하기 때문에, Add-on(1) VScode 의 launch.json 설정값 내용을 토대로 python manage.py test 를 추가해주면 쉽다.

아래는 pytest 기준으로 간단히 적어본다. 테스트코드는 Django의 TestCase 사용 (결국 unittest& pytest 짬뽕이다.. pytest가 보기 편하다)

# pytest 의존성 패키지 설치
pip install pytest
pip install pytest-django

아래 코드는 위에 작성한 health_check 에 대한 테스트케이스이다.

from django.test import Client, TestCase
from django.urls import reverse

class HealthCheckTestCase(TestCase):
    def test_health_check(self):
        client = Client()        
        
        # health_check url은 django.urls.reverse로 가져옴
        response = client.get(reverse('health_check'))
        self.assertEqual(response.status_code, 200)

빠른 실행은 쉘에서 아래 명령어를 통해 base  dev 환경 모두 테스트 가능하다. (pytest.ini 파일을 사용한 방법도 있다. 문서 참고)

# base 환경으로 테스트 실행
pytest --ds=django_debug.settings.base

# dev환경으로 테스트 실행
pytest --ds=django_debug.settings.dev
pytest 문서: Configuring Django settings — pytest-django documentation

 

이를 VScode 디버깅 환경으로 만들면 끝이다. pytest의 경우, VScode에서 자동인식이 안되서 그런지, 직접 입력해줬다.

# launch.json

이전설정들.
...
{
    "name": "Run Test[Pytest]",
    "type": "python",
    "request": "launch",
    "module": "pytest",
    "args": ["--ds=django_debug.settings.base"], # <- base/dev 환경설정
    "django": true
}
]

Run Test[Pytest] 실행 시 health_check 확인가능

이제 개발 & 테스트 과정 모두 디버깅이 가능하다.


디버깅은 프로그래밍에서 가장 기본이며, 필수요건이다. Pycharm과 같이 잘 만들어진 IDE를 사용하는것도 좋지만, 개발자 스스로 직접 환경을 구성해보며 배우는게 훨씬 유연하게 작업이 가능하기에 큰 도움이 된다고 생각한다

 

끝.