본문 바로가기
Python 웹 프레임워크/Django REST framework 3.15

[DRF] 프로젝트 구조 및 코딩컨벤션

by cogito21_python 2024. 7. 5.
반응형

프로젝트 구조

myproject/
    manage.py
    myproject/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    app1/
        migrations/
            __init__.py
        __init__.py
        admin.py
        apps.py
        models.py
        serializers.py
        views.py
        urls.py
        tests/
            __init__.py
            test_models.py
            test_views.py
            test_serializers.py
        permissions.py
    app2/
        migrations/
            __init__.py
        __init__.py
        admin.py
        apps.py
        models.py
        serializers.py
        views.py
        urls.py
        tests/
            __init__.py
            test_models.py
            test_views.py
            test_serializers.py
        permissions.py
    ...

 

주요 파일 설명

serializers.py: 데이터 직렬화 및 역직렬화를 위한 파일.

views.py: API 엔드포인트를 정의하는 파일.

urls.py: 애플리케이션의 URL 라우팅을 정의하는 파일.

tests/: 테스트 코드를 위한 디렉터리. 각 기능에 대한 테스트 파일을 포함.

코딩 컨벤션

일반적인 Python 컨벤션

- PEP 8 가이드라인을 따릅니다.

DRF 특화 컨벤션

serializers

- Serializer 클래스: 직렬화 및 역직렬화 로직을 정의. ModelSerializer를 사용하여 모델 기반 직렬화를 간편하게 정의

from rest_framework import serializers
from .models import MyModel

class MyModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = ['id', 'name', 'created_at']

views

- APIView 또는 Generic Views: APIView를 사용하여 뷰 로직을 정의하거나 Generic Views를 사용하여 CRUD 작업을 간편하게 처리

- ViewSets:ViewSet을 사용하여 여러 HTTP 메소드를 한 클래스에서 처리. ModelViewSet을 사용하여 기본 CRUD 작업을 처리

from rest_framework import generics, viewsets
from .models import MyModel
from .serializers import MyModelSerializer

class MyModelListCreateAPIView(generics.ListCreateAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

class MyModelViewSet(viewsets.ModelViewSet):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

URLs

- Router: routers 모듈을 사용하여 ViewSet과 URL을 간편하게 매핑

from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import MyModelViewSet

router = DefaultRouter()
router.register(r'mymodels', MyModelViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

Permissions

- Custom Permissions: 커스텀 권한 클래스를 정의하여 API 접근 권한을 제어

from rest_framework import permissions

class IsOwnerOrReadOnly(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
        if request.method in permissions.SAFE_METHODS:
            return True
        return obj.owner == request.user

Tests

Test Structure: 각 기능별로 테스트 파일을 분리하여 작성

from rest_framework.test import APITestCase
from django.urls import reverse
from .models import MyModel

class MyModelTests(APITestCase):
    def test_create_mymodel(self):
        url = reverse('mymodel-list')
        data = {'name': 'Test Model'}
        response = self.client.post(url, data, format='json')
        self.assertEqual(response.status_code, 201)
        self.assertEqual(MyModel.objects.count(), 1)
        self.assertEqual(MyModel.objects.get().name, 'Test Model')

추가적인 DRF 컨벤션

- 커스텀 예외 처리는 exceptions.py 파일에 정의합니다.

- 복잡한 쿼리셋 로직은 매니저 클래스에 정의합니다.

- API 버전 관리를 사용할 경우, 버전별로 디렉토리를 만듭니다 (예: api/v1/, api/v2/).

 

반응형