본문 바로가기
취대넓얕

[기술면접] 19일차 문답 | permission_classes, Django DB

by 째깍단 2023. 8. 14.

💡 DRF permission_classes를 사용하는 이유는 무엇입니까?

API의 다른 부분에 대한 다양한 사용자의 액세스 권한을 설정하는데 사용되며, 항상 view의 시작점에서 검증한다.

 

 

APIView에는 기본적으로 permission_classes 변수를 가지고 있고, default 값으로 Django setting에서 설정한 값을 가진다.

Default 값을 통해 전체 API에 인증절차를 적용할 수 있으며, 필요할 경우 각 APIView에 permission_classes에 필요한 permission을 명시하면 된다.

 

check_permissions 로직 :

method handler가 호출되기 전에 호출.

모든 permission에 대해 has_permission을 호출, 만약 특정 permission이 만족되지 않는다면 permission_denied 처리를 한다.

이 때 has_permission은 간단하게 False, True를 리턴한다.

 

-> APIView를 상속한 클래스에서 permission_classes만 명시하면

     부모 클래스에서 그 때 그 때 Permission 클래스 객체를 만들고, 클래스의 has_permission() 함수를 통해 권한을 체크한다.

 

 

+ APIView에서의 Permission_classes처리 :

class APIView(View):

    # The following policies may be set at either globally, or per-view.
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
    parser_classes = api_settings.DEFAULT_PARSER_CLASSES
    authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES
    throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
    permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES

	...

	def get_permissions(self):
        """
        Instantiates and returns the list of permissions that this view requires.
        """
        return [permission() for permission in self.permission_classes]

	...
	def check_permissions(self, request):
        """
        Check if the request should be permitted.
        Raises an appropriate exception if the request is not permitted.
        """
        for permission in self.get_permissions():
            if not permission.has_permission(request, self):
                self.permission_denied(
                    request,
                    message=getattr(permission, "message", None),
                    code=getattr(permission, "code", None),

 

 

 

 

+ Permission 처리 방법 :

기본 권한 정책은 DEFAULT_PERMISSION_CLASSES설정을 사용하여 전체적으로 설정할 수 있다.

AllowAny, IsAuthenticated, IsAdminUser, IsAuthenticatedOrReadOnly 등을 사용할 수 있음

 

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

 

CBV에서 사용하는 경우,

class ExampleView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)

 

또는 @api_view함수 기반 뷰와 함께 데코레이터를 사용하는 경우.

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def example_view(request, format=None):
    content = {
        'status': 'request was permitted'
    }
    return Response(content)

 

 

+ Custom permissions

  • has_permission(self, request, view)
  • has_object_permission(self, request, view, obj)

 

[공식문서] : https://www.django-rest-framework.org/api-guide/permissions/

 

 

 

 

💡 Django는 어떤 종류의 데이터베이스를 사용합니까? Flask와의 차이는 무엇입니까?

 

1) Django 의 DB

 

Django는 다양한 데이터베이스 백엔드를 지원하며, 개발자는 프로젝트 설정에서 원하는 데이터베이스를 선택할 수 있다.

기본 DB로 sqlite를 사용하며 settings.py에서 DATABASES 항목을 구성하여 사용할 데이터베이스를 설정할 수 있다.

Django의 ORM이 일관된 데이터 모델을 정의해주고 데이터베이스에 접근하기 위한 고수준의 추상화를 제공하므로 코드의 큰 수정 없이 교체나 변경없이 DB 시스템을 교체하거나 변경할 수 있다.

 

 

2) Flask와의 차이

 

Django와 Flask는 둘 다 Python을 기반으로 한 웹 프레임워크이지만 차이점이 있다.

Django는 내장 기능이 많아 무거우며, 기본 DB가 있고 ORM이 기본적으로 데이터베이스를 생성해주고 연결을 보장해준다.

반면 Flask는 따로 ORM이 없어 python패키지로 따로 DB를 연결해야하며, 가벼운 소프트웨어여서 소규모 어플리케이션에 적합하다.

가볍기 때문에 확장이나 커스터마이징에는 Flask가 더 좋은 편.

 

 

 

더 공부하자, Django vs Flask vs FastAPI:

https://tech.toktokhan.dev/2021/06/28/python-web-framework/

 

 

 

 

💡 Django에서 PostgreSQL 선호하는 이유는 무엇입니까?

PostgreSQL은 강력한 오픈소스 관계형 데이터베이스 시스템으로 특히 Django와 함께 사용할 때 장점이 있습니다.

 

1) Django는 PostgreSQL에서만 작동하는 다양한 데이터 유형을 제공한다.

    ex. JSON, hstroe, 배열, 기간 등

    = 유연한 데이터 모델링, 효율적인 데이터 저장을 가능하게 한다.

 

2) 대규모 응용 프로그램 및 데이터베이스에 적합한 높은 수준의 확장성과 성능을 제공한다.

    테이블과 데이터베이스 간의 관계를 효율적으로 다루며, 복잡한 쿼리와 인덱싱을 지원한다

 

3) 데이터의 무결성을 유지하며, ACID 트랜잭션등의 데이터베이스의 안정성을 높여주는 기능을 많이 제공한다.

    = 데이터의 일관성, 안정성, 신뢰성을 높인다.

 

4) 자체 기능을 많이 가지고 있으며 확장 모듈을 통해 필요한 기능을 쉽게 추가할 수 있다.

    GIS(Geographic Information System), 텍스트 검색, 암호화 등 다양한 확장 모듈을 활용할 수 있다.