일기 대신 코드 슬쩍

[백엔드][장고][Django] Chapter #12 본문

Backend/Django

[백엔드][장고][Django] Chapter #12

코코자 2023. 7. 24. 21:48

#12.0 User Profile

  • config의 urls.py에서 path("api/v1/users/", include("users.urls")), 다음과 같이 경로 추가

  • views.py
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.permissions import IsAuthenticated
from . import serializers

class Me(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user
        serializer = serializers.PrivateUserSerializer(user)
        return Response(serializer.data)
    
    def put(self, request):
        user = request.user
        serializer = serializers.PrivateUserSerializer(
            user,
            data = request.data,
            partial = True,
        )
        if serializer.is_valid():
            user = serializer.save()
            serializer = serializers.PrivateUserSerializer(
                user
            )
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

  • serializers.py
from rest_framework.serializers import ModelSerializer
from .models import User


class TinyUserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = (
            "name",
            "avatar",
            "username",
        )

class PrivateUserSerializer(ModelSerializer):
    class Meta:
        model = User
        exclude = (
            "password",
            "is_superuser",
            "id",
            "is_staff",
            "is_active",
            "first_name",
            "last_name",
            "groups",
            "user_permissions",
        )

  • urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("me", views.Me.as_view() )
]

#12.1 Create User

  • user를 만들 수 있게 해주는 api 작성할 것임
  • views.py
from django.contrib.auth import authenticate, login, logout
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.exceptions import ParseError, NotFound
from rest_framework.permissions import IsAuthenticated
from users.models import User
from . import serializers

class Me(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = request.user
        serializer = serializers.PrivateUserSerializer(user)
        return Response(serializer.data)
    
    def put(self, request):
        user = request.user
        serializer = serializers.PrivateUserSerializer(
            user,
            data = request.data,
            partial = True,
        )
        if serializer.is_valid():
            user = serializer.save()
            serializer = serializers.PrivateUserSerializer(
                user
            )
            return Response(serializer.data)
        else:
            return Response(serializer.errors)
        
class Users(APIView):

    def post(self, request):
        password = request.data.get('password')
        if not password:
            raise ParseError
        serializer = serializers.PrivateUserSerializer(data = request.data)
        if serializer.is_valid():
            user = serializer.save()
            user.set_password(password)
            user.save()
            serializer = serializers.PrivateUserSerializer(user)
            return Response(serializer.data)
        else:
            return Response(serializer.errors)

  • urls.py
from django.urls import path
from . import views

urlpatterns = [
    path("", views.Users.as_view()),
    path("me", views.Me.as_view() ),
    path("change-password", views.ChangePassword.as_view()),
    path("log-in", views.LogIn.as_view()),
    path("log-out", views.LogOut.as_view()),
    path("@<str:username>", views.PublicUser.as_view()),
]

#12.2 Change Password

  • urlpatterns에서 path 순서도 중요함! 순서에 따라 우선순위가 당연하게 생기니께
  • 항상 기억하자 password는 절대 password그대로 저장하지 않음! 무조건 hash함수를 이용해서 저장!

#12.3 Login and Logout

  • 장고 내에 authenticate이라고 username과 password 를 돌려주는 함수가 존재함