Westagram Mission들을 진행하면서 초기 개발 세팅, 데이터베이스 모델링, 회원가입 기능까지 구현을 완료했다. 그 후 회원가입 한 회원의 정보를 토대로 로그인 기능 위한 View을 구현하려 한다. 잘못된 접근을 시도했을 경우 에러가 나고 모든 조건을 충족 시 Success 메시지를 출력할 수 있도록 View를 작성해보자.
주어진 View 기능은 위와 같고, 조건에 맞는 Json Response를 출력하면 된다. View Class를 작성하기 전 먼저 Model부터 살펴보자.
회원가입 기능을 구현하기 위해 작성한 Model은 아래와 같다.
from django.db import models
# Create your models here.
class User(models.Model):
name = models.CharField(max_length=45)
email = models.CharField(max_length=200, unique=True)
password = models.CharField(max_length=200)
phone_number = models.CharField(max_length=45)
age = models.PositiveIntegerField()
class Meta:
db_table = 'users'
def __str__(self):
return self.name
5개의 field를 가지고 있는 Table로, 계정으로 사용되는 email
은 unique
속성을 가지고 있다. 이제 Model의 class와 field를 살펴봤으니 View를 구현해보자.
View의 SignInView는 다음과 같이 작성했다.
먼저 키가 제대로 전달되지 않았을 경우 Key Error를 반환하기 위해 try
와 except
를 사용했다.
try:
...
...
except KeyError:
return JsonResponse({"MESSAGE":"KEY_ERROR"}, status=400)
그 후 계정이나 비밀번호를 잘못 입력한 경우 status 401의 Invalid User 에러를 출력해야 한다.
계정을 제대로 입력했는지 여부를 판단하려면 httpie로 받은 Json Data의 email이 Database에 존재하는지 확인하면 된다. Json Data의 email 계정의 존재 여부가 확인되면, 그 email을 저장하고 있는 User Instance의 password와 Json Data의 password를 비교한다.
if not User.objects.filter(email = data['email']).exists():
return JsonResponse({"MESSAGE":"INVALID_USER"}, status=401)
if User.objects.get(email = data['email']).password != data['password']:
return JsonResponse({"MESSAGE":"INVALID_USER"}, status=401)
같은 json response를 return하므로 if문의 조건에
or
를 사용해도 가능하지만, 코드가 너무 길어지기 때문에 나누어 코딩했다.
Email이나 Password에 값을 넣지 않은 경우 Json Data와 공백을 비교해 조건문으로 처리하여 Input Data가 없다는 메시지를 출력하도록 했다. 그 후 완성된 SignIn View는 다음과 같다.
class SignInView(View):
def post(self, request):
try:
data = json.loads(request.body)
if data['email']=="" or data['password']=="":
return JsonResponse({"MESSAGE":"NO_INPUT_DATA"}, status=400)
if not User.objects.filter(email = data['email']).exists():
return JsonResponse({"MESSAGE":"INVALID_USER"}, status=401)
if User.objects.get(email = data['email']).password != data['password']:
return JsonResponse({"MESSAGE":"INVALID_USER"}, status=401)
return JsonResponse({"MESSAGE":"SUCCESS"}, status=201)
except KeyError:
return JsonResponse({"MESSAGE":"KEY_ERROR"}, status=400)
클라이언트 요청에 맞춰 View를 호출할 수 있도록 urls.py를 다음과 같이 수정했다.
from django.urls import path
from users.views import SignUpView, SignInView
urlpatterns = [
path('/signup', SignUpView.as_view()),
path('/signin', SignInView.as_view()),
]
기존에 있던 회원가입 기능의 View는 SignUp, 로그인 기능의 View는 SignIn으로 하여 가독성이 좋고 직관적인 url을 생성했다. 이제 View가 제대로 구현되었는지, 여러가지 접근을 통해 결과를 살펴보자.
어떤 잘못된 접근으로 어떠한 에러가 나고, 조건을 만족시켰을 때 Success 메시지가 출력되는지 확인해보자. httpie를 통한 접근에 사용할 계정은 leon1111@naver.com, 비밀번호는 dudnxld1@ 이다.
http -v POST 127.0.0.1:8000/users/signin email="leon1111@naver.com"
http -v POST 127.0.0.1:8000/users/signin password="dudnxld1@"
위와 같이 httpie 코드 자체에 email이나 password가 누락된 경우except
로 넘어가 다음과 같이 400 Key Error가 발생한다.
http -v POST 127.0.0.1:8000/users/signin email="leon1111@naver.com" password=""
http -v POST 127.0.0.1:8000/users/signin email="" password="dudnxld1@"
단순히 httpie에서 누락된 것이 아니라 위와 같이 공백상태인 경우 try
에서 첫번째 if문에 걸려 400 NoInputData Error를 출력한다.
http -v POST 127.0.0.1:8000/users/signin email="leonoleon@naver.com" password="dudnxld1@"
http -v POST 127.0.0.1:8000/users/signin email="leon111@naver.com" password="12345@"
이메일이 존재하지 않거나 비밀번호를 잘못 입력했을 경우 다음과 같이 401 Invalid User 메시지가 출력된다.
http -v POST 127.0.0.1:8000/users/signin email="leon1111@naver.com" password="dudnxld1@"
올바른 계정과 비밀번호를 입력하면 제대로 Success 메시지를 출력하는 것을 볼 수 있다.
http -v POST 127.0.0.1:8000/user/signin email="leon1111@naver.com" password="dudnxld1@"
url 부분의 users
에서 s
를 빼 url mapping이 제대로 되지 않을 경우 404 Error를 발생시킨다.
👍🏼👍🏼👍🏼