TIL 28 | Django 로그인 기능

임종성·2021년 7월 24일
1

Django

목록 보기
9/17
post-thumbnail

Westagram Mission들을 진행하면서 초기 개발 세팅, 데이터베이스 모델링, 회원가입 기능까지 구현을 완료했다. 그 후 회원가입 한 회원의 정보를 토대로 로그인 기능 위한 View을 구현하려 한다. 잘못된 접근을 시도했을 경우 에러가 나고 모든 조건을 충족 시 Success 메시지를 출력할 수 있도록 View를 작성해보자.

로그인 View 기능 정의

  1. 로그인을 할 경우 사용자(User)의 계정(Email)과 비밀번호(Password)가 필수다.
  2. 계정이나 비밀번호가 전달되지 않았을 경우 {"message": "KEY_ERROR"}, status code 400 을 반환한다.
  3. 계정을 잘 못 입력한 경우 {"message": "INVALID_USER"}, status code 401을 반환한다.
  4. 비밀번호를 잘 못 입력한 경우 {"message": "INVALID_USER"}, status code 401을 반환
  5. 로그인이 성공하면 {"message": "SUCCESS"}, status code 200을 반환

주어진 View 기능은 위와 같고, 조건에 맞는 Json Response를 출력하면 된다. View Class를 작성하기 전 먼저 Model부터 살펴보자.

User 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로, 계정으로 사용되는 emailunique속성을 가지고 있다. 이제 Model의 class와 field를 살펴봤으니 View를 구현해보자.

View Class

View의 SignInView는 다음과 같이 작성했다.

먼저 키가 제대로 전달되지 않았을 경우 Key Error를 반환하기 위해 tryexcept를 사용했다.

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)

URL

클라이언트 요청에 맞춰 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가 제대로 구현되었는지, 여러가지 접근을 통해 결과를 살펴보자.

Various Error & Success

어떤 잘못된 접근으로 어떠한 에러가 나고, 조건을 만족시켰을 때 Success 메시지가 출력되는지 확인해보자. httpie를 통한 접근에 사용할 계정은 leon1111@naver.com, 비밀번호는 dudnxld1@ 이다.

이메일이나 비밀번호를 httpie에서 누락했을 경우(HTTP 400)

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 400)

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 401)

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 200)

http -v POST 127.0.0.1:8000/users/signin email="leon1111@naver.com" password="dudnxld1@"

올바른 계정과 비밀번호를 입력하면 제대로 Success 메시지를 출력하는 것을 볼 수 있다.

url주소를 잘못 입력한 경우(HTTP 404)

http -v POST 127.0.0.1:8000/user/signin email="leon1111@naver.com" password="dudnxld1@"

url 부분의 users에서 s를 빼 url mapping이 제대로 되지 않을 경우 404 Error를 발생시킨다.

profile
어디를 가든 마음을 다해 가자

1개의 댓글

comment-user-thumbnail
2021년 7월 26일

👍🏼👍🏼👍🏼

답글 달기