6.[drf] 공통 앱 만들기

공통 common 앱

  • 추상앱
  • 다른 앱들을 만들기 전에 모든 앱에 적용되는 공통앱을 먼저 만들도록 하겠습니다.

models.py

import uuid
from django.db import models

class TimeStampedUUIDModel(models.Model):
    pkid = models.BigAutoField(primary_key=True, editable=False)
    id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True
        ordering = ["-created", "-updated"]

커스텀 에러 핸들링 - 포스트맨에서 에러 status코드도 보여준다던지 커스텀 가능

exceptions.py

from rest_framework.views import exception_handler

def common_exception_handler(exc, context):
    response = exception_handler(exc, context)
    handler = {
        "Not Found" : _handle_not_found_error,
        "ValidationError" : _handle_generic_error,
    }

    exception_class = exc.__class__.__name__

    if exception_class in handler:
        return handler[exception_class](exc, context, response)
    return response

def _handle_generic_error(exc, context, response):
    status_code = response.status_code
    response.data = {"status_code": status_code, "errors": response.data}

    return response

def _handle_not_found_error(exc, context, response):
    view = context.get("view", None)

    if view and hasattr(view, "queryset") and view.queryset is not None:
        status_code = response.status_code
        error_key = view.queryset.model._meta.verbose_name
        response.data = {"status_code": status_code, "errors": {error_key:response.data["data"]}}

    else:
        response = _handle_generic_error(exc, context, response)
    return response

settings.py

REST_FRAMEWORK = {
    "EXCEPTION_HANDLER": "core_apps.common.exceptions.common_exception_handler",
    "NON_FIELD_ERRORS_KEY" : "error",
}