(코드)
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"
(코드)
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)
키 에러, 즉 딕셔너리 형태의 키 모양을 전혀 고려하지 않음.
(코드)
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)
왜 post? : 단순 get으론 사용자 정보가 유출. get은 주고 post 는 받는 것이 아님. 로그인의 경우 조금 특별한 예외라 생각하고 post 요청으로 받아들이는 것이 옳다.
try / except 예외처리 :
왜 사용할까? : 일단 받은 데이터에 대해 다시 보내려면 첫 번째 조건인 KEY_ERROR부터 봐야한다. 이 말은 쿼리를 잠시 단순 딕셔너리 형태라 볼 때 email = ~ 이 이렇게 순순히 올거란 생각 말고 emailkdjfkjd 이렇게 키 자체가, 즉 양식 자체를 파괴해서 요청이 올 것도 대비하고 예외처리를 시키는걸 먼저 생각해야한다는 것이다.
과정 :
1) try, except 구조 먼저 잡기
2) user라는 변수 설정 -> User에 저장된 값을 불러오기 위해 objects.filter 사용 ; 필터에서 이메일과 패스워드를 가져와서 조건을 맞춤
3) 조건문 붙이기 : 전체 정보가 필터값에 존재하는 것과 일치하면->성공 / 아니면 일치하지 않는 값(예 : 비밀번호가 틀렸다) 리턴
4) 마지막 KeyError: 를 통해 실제 키에 대한 에러를 내준다. 여기서 리턴은 그에 대한 response라고 봐야한다.
전체적으로 이해하기가 쉽지 않은 로직이라 눈에 많이 익혀둬야겠다. 설명하면서도 이게 맞는지 모르겠다. + 동기분과도 이야기 했는데 전체적으로 좀 꼬인 로직이라고 한다. 근데 어디서부터 잘못된건지 잘 모르겠어서 코드 리뷰 후 방향 잡고 수정해야할 듯 싶다. 일단 결과값에는 이상이 없다.
(프로젝트)
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.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 '/'. 에러 나서 / 사용 위와 같이 함.'''