drf 라이브러리

김나현·2024년 11월 5일

장고 rest frame work
사용한 라이브러리

1. Django REST Framework SimpleJWT

JWT 기반 인증 구현.
많은 API가 인증을 필요로 하며, SimpleJWT는 접근과 갱신을 위한 JWT를 간편하게 관리할 수 있습니다. 사용 예시와 유지보수 상태가 좋기 때문에 DRF와 함께 자주 사용됩니다.
개요: Django REST Framework SimpleJWT는 Django REST Framework와 함께 사용하는 JWT 인증을 위한 라이브러리로, 더 많은 기능과 커스터마이징 옵션을 제공합니다.

유지보수: 활발하게 유지보수되고 있으며, 최신 Django 및 DRF와의 호환성이 보장됩니다.

기능:
Access Token과 Refresh Token의 분리: Access Token을 만료시키고 Refresh Token으로 새로운 Access Token을 발급받을 수 있는 기능을 제공합니다.

다양한 옵션 제공: 토큰의 유효 기간, 서명 알고리즘, 유효성 검사를 위한 커스터마이징이 가능합니다.

Django Admin에서 관리: 토큰을 관리할 수 있는 추가적인 옵션이 있습니다.

설치

pip install djangorestframework-simplejwt

settings.py에 추가합니다.

# settings.py
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
}
# urls.py
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView

urlpatterns = [
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

주요 차이점 요약
유지보수 및 업데이트:

Django REST Framework JWT: 현재 유지보수가 잘 이루어지지 않음.
Django REST Framework SimpleJWT: 활발하게 유지보수되고 있으며, 최신 기능이 지속적으로 추가됨.
기능:

Django REST Framework JWT: 기본적인 JWT 기능만 제공.
Django REST Framework SimpleJWT: Access Token과 Refresh Token을 분리하여 관리할 수 있고, 커스터마이징 옵션이 많음.

설정 및 사용의 용이성:
두 라이브러리 모두 설정이 간단하지만, SimpleJWT는 더 많은 옵션을 제공하므로 더 유연하게 구성할 수 있습니다.

2. Django CORS Headers

교차 출처 리소스 공유Cross-Origin Resource Sharing(CORS)로 쉽게 설정할 수 있도록 해주는 라이브러리로, API를 다른 도메인에서 호출할 수 있게 해줍니다.

프론트엔드 애플리케이션이 다른 도메인에서 호스팅되는 Django 백엔드 API에 접근할 수 있도록 허용

클라이언트가 다른 도메인에서 API에 요청할 때 CORS 오류가 발생하지 않도록 도와줍니다. 예를 들어, 프론트엔드와 백엔드가 다른 도메인에 있을 때 유용합니다.

설치

pip install django-cors-headers

settings.py에 추가합니다.

INSTALLED_APPS = [
    ...
    'corsheaders',
    ...
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    ...
]

CORS_ALLOWED_ORIGINS = [
    "https://example.com",
]

3. Django Channels

비동기 웹 애플리케이션 기능을 제공하여 실시간 웹소켓 통신과 비동기 작업 처리를 가능하게 합니다.
Django는 기본적으로 동기 요청-응답 모델이기 때문에 Channels가 필요한 상황이 많습니다.
Channels를 통해 실시간 채팅, 알림, 실시간 데이터 스트리밍(업데이트) 등의 작업을 Django에서 쉽게 구현할 수 있습니다.
-기존 Django의 동기 처리만으로는 실시간 기능이 어렵기 때문에 Channels로 이를 해결

설치
Channels와 메시지 브로커로 사용할 Redis를 설치합니다. Redis는 비동기 통신과 메시지 큐 역할을 하며, Channels의 기본 백엔드로 자주 사용됩니다.

pip install channels channels-redis

예시
Django Channels를 설정하고 간단한 실시간 WebSocket Consumer를 만들어보겠습니다.

settings.py에 Channels와 Redis 설정을 추가합니다.

INSTALLED_APPS = [
    ...,
    'channels',  # Channels 설치
]


# Channels의 ASGI 설정
ASGI_APPLICATION = "myproject.asgi.application"

# Redis를 Channels의 메시지 백엔드로 사용
CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": {
            "hosts": [("127.0.0.1", 6379)],  # 로컬 Redis 서버 주소와 포트
        },
    },
}

ASGI 설정

Channels는 ASGI를 통해 비동기 서버와 통신하므로, asgi.py 파일을 설정합니다.

import os
from django.core.asgi import get_asgi_application
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
from myapp.routing import websocket_urlpatterns

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")

application = ProtocolTypeRouter({
    "http": get_asgi_application(),
    "websocket": AuthMiddlewareStack(
        URLRouter(
            websocket_urlpatterns
        )
    ),
})

URL 라우팅 설정
WebSocket 요청을 처리하기 위해 URL 라우팅을 설정합니다. myapp/routing.py에 WebSocket URL을 정의합니다.

from django.urls import path
from . import consumers

websocket_urlpatterns = [
    path("ws/chat/", consumers.ChatConsumer.as_asgi()),
]

WebSocket Consumer 작성

Channels에서 Consumer는 Django의 뷰와 유사한 역할을 합니다. myapp/consumers.py에 실시간 채팅 WebSocket Consumer를 작성합니다.

import json
from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    async def connect(self):
        await self.accept()  # 클라이언트 연결 승인

    async def disconnect(self, close_code):
        pass  # 연결 해제 처리

    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json["message"]

        # 클라이언트로 메시지 전송
        await self.send(text_data=json.dumps({
            "message": message
        }))
profile
참 쉽죠? #개발계의 밥아저씨를 꿈꿉니다⋆⁺₊⋆ ☾⋆⁺₊⋆

0개의 댓글