drf 라이브러리

김나현·2024년 11월 5일
0

장고 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개의 댓글