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