본문 바로가기

매일 TIL

[내일배움캠프 12-4일] django 심화과제, accounts 앱 구현

https://github.com/SoonGyum/team9_djangotimes

 

GitHub - SoonGyum/team9_djangotimes

Contribute to SoonGyum/team9_djangotimes development by creating an account on GitHub.

github.com


from django.urls import path
from . import views

urlpatterns = [
    path("signup/", views.SignupView.as_view()),
    path("signin/", views.SigninView.as_view()),
    path("<str:username>/", views.ProfileView.as_view()),
]
from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
    profile_image = models.ImageField(upload_to='profile_images/', null=True, blank=True)
    introductions = models.TextField(null=True, blank=True)

    def __str__(self):
        return self.username
from .models import User
from rest_framework import serializers

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = (
            "id",
            "username",
            "email",
            "profile_image",
            "introductions",
        )
from django.core.validators import validate_email
from .models import User


def validate_signup(signup_data):
    username = signup_data.get("username")
    password = signup_data.get("password")
    nickname = signup_data.get("nickname")
    birth = signup_data.get("birth")
    first_name = signup_data.get("first_name")
    last_name = signup_data.get("last_name")
    email = signup_data.get("email")

    err_msg_list = []

    # validation
    # validation dup username
    if User.objects.filter(username=username).exists():
        err_msg_list.append({"username" : "이미 존재하는 유저네임입니다."})
   
    # validation email
    try:
        validate_email(email)
    except:
        err_msg_list.append({"email": "올바른 이메일 형식이 아닙니다."})

    # validation dup email
    if User.objects.filter(email=email).exists():
        err_msg_list.append({"email": "이미 존재하는 이메일입니다."})

    if err_msg_list:
        return False, err_msg_list
    else:
        return True, err_msg_list
from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import User
from .validators import validate_signup
from .serializers import UserSerializer
from django.contrib.auth import authenticate
from rest_framework_simplejwt.tokens import RefreshToken
from rest_framework.permissions import IsAuthenticated
from rest_framework.parsers import MultiPartParser, FormParser


class SignupView(APIView):
    parser_classes = [MultiPartParser, FormParser]
   
    def post(self, request):
        is_valid, err_msg = validate_signup(request.data)
        if not is_valid:
            return Response({"error": err_msg}, status=400)

        username = request.data.get("username")
        password = request.data.get("password")
        email = request.data.get("email")
        first_name = request.data.get("first_name", "")
        last_name = request.data.get("last_name", "")
        introductions = request.data.get("introductions", "")
        profile_image = request.FILES.get("profile_image")

        user = User.objects.create_user(
            username=username,
            password=password,
            email=email,
            first_name=first_name,
            last_name=last_name,
            introductions=introductions,
            profile_image=profile_image
        )

        serializer = UserSerializer(user)
        return Response(serializer.data)



class SigninView(APIView):
    def post(self, request):
        user = authenticate(**request.data)
        if not user:
            return Response(
                {"error": "아이디 혹은 비밀번호가 올바르지 않습니다."}, status=400
            )

        res_data = UserSerializer(user).data
        refresh = RefreshToken.for_user(user)
        res_data["access_token"] = str(refresh.access_token)
        res_data["refresh_token"] = str(refresh)
        return Response(res_data)


class ProfileView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request, username):
        user = User.objects.get(username=username)
        serializer = UserSerializer(user)
        return Response(serializer.data)

오늘의 회고

내일 더 열심히 하자.