Django REST Framework 인증, 필터링, 정렬, 페이징 컴포넌트

Django REST Framework에서 제공하는 컴포넌트들은 유사한 구성 방식을 가지고 있습니다. 이들 컴포넌트는 클래스를 상속한 후, 해당 클래스 내에서 필요한 매개변수를 설정하고, 뷰 클래스에 해당 컴포넌트를 추가하거나 전역 설정을 통해 쉽게 사용할 수 있습니다. 이러한 컴포넌트들은 매우 유용하며, 개발 과정에서 자주 사용될 것입니다.

인증 컴포넌트

어떤 인터페이스는 로그인 후에만 접근할 수 있어야 합니다. 먼저 로그인 기능을 구현해야 합니다:

로그인 인터페이스

로그인 기능을 구현하기 위해 다음과 같이 데이터베이스 모델을 준비합니다:

  • User 모델: 사용자명과 비밀번호를 저장
  • UserToken 모델: 사용자와 일대일로 연결된 토큰을 저장

로그인 라우트와 뷰 클래스를 정의합니다. 로그인은 /api/v1/user/login 경로에서 POST 메소드로 요청할 수 있습니다.

# 모델
class User(models.Model):
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=32)

class UserToken(models.Model):
    token = models.CharField(max_length=32)
    user = models.OneToOneField(to='User', on_delete=models.CASCADE, null=True)

# 라우트
router.register('user', UserViewSet, 'user')

# 뷰 클래스
class UserViewSet(ViewSet):
    @action(methods=['POST'], detail=False)
    def login(self, request):
        username = request.data.get('username')
        password = request.data.get('password')
        user = User.objects.filter(username=username, password=password).first()
        if user:
            token = str(uuid.uuid4())
            UserToken.objects.update_or_create(user=user, defaults={'token': token})
            return Response({'code': '100', 'msg': '로그인 성공', 'token': token})
        else:
            return Response({'code': '101', 'msg': '사용자명 또는 비밀번호가 잘못되었습니다'})

인증 기능 구현

로그인 후 사용자 인증을 수행하는 방법을 설명합니다:

# 인증 클래스
from rest_framework import authentication

class CustomAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')
        if not token:
            raise AuthenticationFailed('토큰이 제공되지 않았습니다')
        user_token = UserToken.objects.filter(token=token).first()
        if not user_token:
            raise AuthenticationFailed('로그인 되지 않은 사용자입니다')
        return user_token.user, token

권한 컴포넌트

슈퍼 관리자만 특정 기능을 사용할 수 있도록 하며, 일반 사용자는 단일 데이터 조회만 허용합니다:

# 사용자 모델 확장
class User(models.Model):
    user_type = models.IntegerField(choices=((1, '슈퍼 관리자'), (2, '일반 사용자')), default=2)

# 권한 클래스
class UserPermission(permissions.BasePermission):
    def has_permission(self, request, view):
        if request.user.user_type == 1:
            return True
        self.message = f'당신은 {request.user.get_user_type_display()} 계정입니다. 충분한 권한이 없습니다'
        return False

빈도 제한 컴포넌트

동일한 IP 주소로부터短时间内 특정 인터페이스 호출을 제한합니다:

# 빈도 제한 클래스
from rest_framework.throttling import SimpleRateThrottle

class ApiRateThrottle(SimpleRateThrottle):
    scope = 'api_rate_limit'
    def get_cache_key(self, request, view):
        return request.META.get('REMOTE_ADDR')

필터링, 정렬 컴포넌트

RESTful 규약에 따른 쿼리 매개변수를 통해 데이터를 필터링하고 정렬합니다:

# 필터링
from rest_framework.filters import SearchFilter

class BookViewSet(ViewSet):
    filter_backends = [SearchFilter]
    search_fields = ['name', 'price']

# 정렬
from rest_framework.filters import OrderingFilter

class BookViewSet(ViewSet):
    filter_backends = [OrderingFilter]
    ordering_fields = ['price', 'id']

페이징 컴포넌트

다수의 데이터를 페이지 단위로 나누어 전송합니다:

# PageNumber 페이징
from rest_framework.pagination import PageNumberPagination

class CustomPageNumberPagination(PageNumberPagination):
    page_size = 10
    page_query_param = 'page'
    page_size_query_param = 'size'
    max_page_size = 100

태그: Django REST framework authentication Permissions Rate Limiting

7월 15일 01:56에 게시됨