[실습]
- 새로운 앱(accounts) 생성 및 등록, url 패턴 분리 진행
- 유저 모델 생성
- accounts/models.py
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
pass
- 유저 모델 등록
- mysite/settings.py
AUTH_USER_MODEL = "accounts.User"
- (프로젝트 시작 이후 한번이라도 migrations이 완료된 경우 migrations 및 db 삭제)
- migrations 진행
- jwt token 사용을 위한 library설치
$ pip install djangorestframework-simplejwt
- library 등록 및 설정 추가
- mysite/settings.py
INSTALLED_APPS = [
...
"rest_framework_simplejwt",
]
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
"rest_framework_simplejwt.authentication.JWTAuthentication",
)
}
- 실습 편의를 위해 JWT의 lifetime 설정
from datetime import timedelta
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(days=1),
}
serializer
- accounts/serializers.py
from rest_framework import serializers
from .models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ("id", "username", "email", "password")
extra_kwargs = {"password": {"write_only": True}}
def create(self, validated_data):
user = User.objects.create_user(**validated_data)
return user
회원가입
- User 모델을 만드는 것
- accounts/urls.py
urlpatterns = [
path("register/", views.register),
]
- accounts/views.py
from .serializers import UserSerializer
from rest_framework.response import Response
from rest_framework.decorators import api_view
@api_view(["POST"])
def register(request):
serializer = UserSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=201)
- request / response

로그인
- 토큰을 발급 받는다.
- 이후 서버에 요청할 때 토큰을 전달한다
로그인 - 토큰 발급
- mysite/urls.py
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
urlpatterns = [
path("admin/", admin.site.urls),
path("articles/", include("articles.urls")),
path("accounts/", include("accounts.urls")),
path("api/token/", TokenObtainPairView.as_view(), name="token_obtain_pair"),
path("api/token/refresh/", TokenRefreshView.as_view(), name="token_refresh"),
]
- request / response

로그인 - 서버에 토큰 전달
- 토큰마다 방식이 다르며, JWT의 경우 header에 Authorization : Bearer {access_token} 을 담아 전달한다.
- accounts/urls.py
from django.urls import path
from accounts import views
urlpatterns = [
path("register/", views.register),
path("me/", views.me),
]
- accounts/views.py
@api_view(["GET"])
def me(request):
user = request.user
serializer = UserSerializer(user)
return Response(serializer.data, status=200)
- request / response

Permission
- 일부 사용자에게만 접근을 허가하는 방식
- ex) 비 로그인 유저에게는 요청을 허가하지 않는다.
- accounts/views.py
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
@api_view(["GET"])
@permission_classes([IsAuthenticated])
def me(request):
user = request.user
serializer = UserSerializer(user)
return Response(serializer.data, status=200)
- 또는 전역으로 설정할 수 있다.
- mysite/settings.py
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
"rest_framework_simplejwt.authentication.JWTAuthentication",
),
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
}
- request / response
- 올바른 요청에 대해

- 잘못된 요청에 대해

'Django' 카테고리의 다른 글
마이그레이션 : 관련 모델이나 필드가 해석되지 못할 때 (0) | 2024.03.19 |
---|---|
Django : backend framework(5) (0) | 2024.03.19 |
Django : backend framework(3) (0) | 2024.03.15 |
Django : backend framework(2) (0) | 2024.03.14 |
Django : backend framework(1) (0) | 2024.03.14 |