Westagram with Django 2일차

오늘 작업한 것 : Mission 2~3

Mission 1 : 회원가입 엔드포인트

1. 사용자 테이블 생성

(코드)

  • models.py
from django.db import models

class User(models.Model):
    email    = models.EmailField(max_length=50)
    password = models.CharField(max_length=100)
    
    class Meta:
        db_table = "users"
  • 위스타벅스와 똑같이 이메일, 비밀번호를 갖는 클래스를 하나 만든다. 이 때 이메일은 Emailfield를 이용해준다.
  • 주요 확인 사항 : 변수 이름 정확히 할 것 / 테이블 네임과 클래스 이름은 동일하게 하되 복수형으로 할 것

2. views.py 작성

(코드)

import json

from django.views import View
from django.http  import JsonResponse

from .models import User

class SignupView(View):
    def post(self, request):
        data = json.loads(request.body)
        try:
            user = User.objects.filter(email=data['email'],password=data['password'])
            if User.objects.filter(email=data['email']).exists():
                return JsonResponse({"message": "EMAIL_ERROR"}, status=400)
            if User.objects.filter(password=data['password']).exists():
                return JsonResponse({"message": "PASSOWRD_ERROR"}, status=400)
            if '@' in data['email'] and '.' in data['email'] and len(data['password']) >= 8:
                user     = User.objects.create(
                email    = data['email'],
                password = data['password']
            )
                return JsonResponse({"message": "SUCCESS"}, status=200)
        except KeyError:
            return JsonResponse({"message": "KEY_ERROR"}, status=400)
  • 그 외 내용은 사용자의 이메일, 비밀번호 양식이 맞는지 안 맞는지를 확인한 뒤 if를 사용해서 작성해준다.

  • 헷갈렸던 부분 : 사용자가 이미 등록해놓은 이용자에 대해서 이용자가 있는지 없는지 구분하는 부분? -> 이메일, 필터를 따로 if처리해줘서 해결.

    시간 나는데로 구현해보면 좋은 것 : 정규식을 사용해서 @, . 를 구분해보기

  • 코드 수정 : 아래 로그인 뷰와 마찬가지로 키에러에 대한 이해 부족으로 비슷하게 수정.

(원래 코드)

    def post(self, request):
        data = json.loads(request.body)
        if User.objects.filter(email=data['email']).exists():
            return JsonResponse({"message": "EMAIL_ERROR"}, status=400)
        if User.objects.filter(password=data['password']).exists():
            return JsonResponse({"message": "PASSOWRD_ERROR"}, status=400)
        if '@' in data['email'] and '.' in data['email'] and len(data['password']) >= 8:
            user     = User.objects.create(
            email    = data['email'],
            password = data['password']
        )
            return JsonResponse({"message": "SUCCESS"}, status=200)
        else:
            return JsonResponse({"message": "KEY_ERROR"}, status=400)

키 에러, 즉 딕셔너리 형태의 키 모양을 전혀 고려하지 않음.

3. 로그인 뷰 만들기

(코드)

class LoginView(View):
    def post(self, request):
        data = json.loads(request.body)
        try:
            user = User.objects.filter(email=data['email'],password=data['password'])
            if User.objects.all().filter(email=data['email'], password=data['password']).exists() == True:
                return JsonResponse({"message":"SUCCESS"}, status=200)
            else:
                return JsonResponse({"message":"INVALID_USER"}, status=401)
        except KeyError:
            return JsonResponse({"message":"KEY_ERROR"}, status=400)
핵심 : try / except 사용한 코드
  1. 왜 post? : 단순 get으론 사용자 정보가 유출. get은 주고 post 는 받는 것이 아님. 로그인의 경우 조금 특별한 예외라 생각하고 post 요청으로 받아들이는 것이 옳다.

  2. try / except 예외처리 :

  • 왜 사용할까? : 일단 받은 데이터에 대해 다시 보내려면 첫 번째 조건인 KEY_ERROR부터 봐야한다. 이 말은 쿼리를 잠시 단순 딕셔너리 형태라 볼 때 email = ~ 이 이렇게 순순히 올거란 생각 말고 emailkdjfkjd 이렇게 키 자체가, 즉 양식 자체를 파괴해서 요청이 올 것도 대비하고 예외처리를 시키는걸 먼저 생각해야한다는 것이다.

  • 과정 :
    1) try, except 구조 먼저 잡기
    2) user라는 변수 설정 -> User에 저장된 값을 불러오기 위해 objects.filter 사용 ; 필터에서 이메일과 패스워드를 가져와서 조건을 맞춤
    3) 조건문 붙이기 : 전체 정보가 필터값에 존재하는 것과 일치하면->성공 / 아니면 일치하지 않는 값(예 : 비밀번호가 틀렸다) 리턴
    4) 마지막 KeyError: 를 통해 실제 키에 대한 에러를 내준다. 여기서 리턴은 그에 대한 response라고 봐야한다.

전체적으로 이해하기가 쉽지 않은 로직이라 눈에 많이 익혀둬야겠다. 설명하면서도 이게 맞는지 모르겠다. + 동기분과도 이야기 했는데 전체적으로 좀 꼬인 로직이라고 한다. 근데 어디서부터 잘못된건지 잘 모르겠어서 코드 리뷰 후 방향 잡고 수정해야할 듯 싶다. 일단 결과값에는 이상이 없다.

4. 그 외 urls.py 지정

(프로젝트)

from django.urls import path, include

urlpatterns = [
    path('account/', include('account.urls'))

]

(앱)

from django.urls import path
from .views      import *

urlpatterns = [
    path('user', UserView.as_view()),
    path('login', LoginView.as_view()),    
]
  • urls.py 슬래시 위치 확인

    (urls.w002) your url pattern '/user' has a route beginning with a '/'. remove this slash as it is unnecessary. if this pattern is targeted in an include(), ensure the include() pattern has a trailing '/'. 에러 나서 / 사용 위와 같이 함.'''

5. 추가로 공부해야할 점

  • 앞으로 try / except 나올 때 참고하여 익숙해지기
  • git에 익숙해지기
  • 중간 중간 난 에러들(405, / ... 잘 기억해두기)

참고 블로그

/ 에러
위코드 선배님 블로그 내용 참조

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글