반응형
프로젝트 구조
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/
).
반응형
'웹 개발 프레임워크 > Django REST framework 3.15' 카테고리의 다른 글
[DRF] 주요 기능별 클래스 및 함수 (0) | 2024.07.05 |
---|---|
[DRF] 버전별 특징 (0) | 2024.07.05 |
[DRF] Django REST Framework 특징 및 소개 (0) | 2024.07.05 |
[DRF] 목차 (0) | 2024.07.05 |