HTTP를 통한 장고 CRUD 작업 시 요청에 따른 데이터의 유효성을 검사할 수 있습니다. 유효성을 검사하려는 별도의 validators.py를 만들어서 활용할 수도 있고, views.py에서 바로 작업할 수도 있습니다. 오류가 발생하면 Validation
등 해당하는 raise
하여 적절한 응답과 상태를 전달할 수 있습니다.
POST 요청 데이터 유효성 검사
이전 포스팅에서 모델을 작성하며 이메일과 같은 데이터의 중복 방지를 막기 위해unique=True
속성을 사용했었는데요. 이렇게 하면 기존에 존재하는 데이터 값과 동일한 값이 사용자로부터 전달될 경우 IntegrityError
가 발생합니다. 이것이 오류 검사를 진행해야 할 첫번 째 경우입니다.
두 번째 경우는 이러한 중복 뿐만 아니라 사용자가 입력하는 이메일이나 패스워드가 형식과 규칙을 만족하는 지 판단해야 할 수 있습니다. 이 때는 raise
와 정규식을 사용하여 POST 요청 데이터의 유효성을 검사할 수 있습니다.
# users validators.py
import re
from django.core.exceptions import ValidationError
def is_email_valid(email):
REGEX_EMAIL = '([A-Za-z0-9]+[.-_])*[A-Za-z0-9]+@[A-Za-z0-9-]+(\.[A-Z|a-z]{2,})+'
if not re.fullmatch(REGEX_EMAIL, email):
raise ValidationError("EMAIL_INPUT_ERROR")
def is_password_valid(password):
REGEX_PASSWORD = '^(?=.*[\d])(?=.*[A-Z])(?=.*[a-z])(?=.*[@#$])[\w\d@#$]{8,}$'
if not re.fullmatch(REGEX_PASSWORD, password):
raise ValidationError("PASSWORD_INPUT_ERROR")
정규 표현식을 통한 validators.py 작성을 마쳤다면 이제 이를 views.py에 불러온 다음 try...except
구문을 사용하여 오류를 처리할 차례입니다.
오류가 발생하지 않으면 마지막의 JsonResponse({"message": "SUCCESS"}, status=201)
가 리턴되며, 오류가 발생할 경우 해당하는 오류에 따른 메시지와 status
가 전달됩니다.
# users views.py
import json
from django.shortcuts import render
from django.http import JsonResponse
from django.http.response import HttpResponse
from django.views import View
from django.core.exceptions import ValidationError
from django.db.utils import IntegrityError
from .models import User
from .validators import is_email_valid, is_password_valid
class RegisterView(View):
def post(self, request):
data = json.loads(request.body)
try:
name = data["name"]
email = data["email"]
password = data["password"]
contact = data["contact"]
note = data["note"]
is_email_valid(email)
is_password_valid(password)
user = User.objects.create(
name = name,
email = email,
password = password,
contact = contact,
note = note
)
return JsonResponse({"message": "SUCCESS"}, status=201)
except KeyError:
return JsonResponse({'message': "KEY_ERROR"})
except IntegrityError:
return JsonResponse({'message': "INTEGRITY_ERROR"})
except ValidationError as e:
return JsonResponse({'message': f"{e.message}"})
GET 요청 데이터 유효성 검사
이번에는 새로운 login 앱에서 사용자가 로그인을 위해 전달하는 데이터가 데이터베이스에 저장된 이메일 및 패스워드와 일치하는 지 확인해보도록 하겠습니다.
이때는 User.objects.filter
를 사용하여 사용자가 입력하는 이메일과 패스워드가 기존 데이터베이스에 저장된 email
및 password
값과 일치하는 지 판단할 수 있습니다.
여러 방법이 있겠지만 다음과 같이 filter
를 통해 필터링을 시도한 객체가 존재하는지 .exists()
를 통해 판단할 수 있습니다. 정확히 일치하는 값이 존재할 경우 True
가 출력되며, 아닌 경우에는 False
가 출력되며, 조건문을 활용해 이를 처리할 수 있습니다.
# login views.py
import json
from django.shortcuts import render
from django.http import JsonResponse
from django.views import View
from django.core.exceptions import ValidationError
from users.models import User
class LoginView(View):
def get(self, request):
data = json.loads(request.body)
try:
email = data["email"]
password = data["password"]
userValidation = User.objects.filter(email=email, password=password).exists()
if not userValidation:
raise ValidationError({'message': "Please check email or password"})
return JsonResponse({'message': "SUCCESS"}, status=200)
except KeyError:
return JsonResponse({'message': "KEY_ERROR"}, status=400)
except ValidationError:
return JsonResponse({'message': "INVALID_USER"}, status=401)
추가적으로 굳이 Error
를 raise
하지 않고 if
문으로 예외 처리를 할 수도 있는데요. 다음과 같은 차이점이 있습니다.
- raise를 통해 처리하면 'message' 더불어 'code', 'params', 'error_list'와 같은 속성들이 추가적으로 반환되어 이에 접근할 수 있음
- 서버 오류 등 위에 해당하지 않는 특정 상황에서 오류만으로 이를 처리할 수 있음(이전에 register에서 만들었던 KeyError와 같은 경우에는 따로 함수를 작성하지 않고도 처리 가능) 더 읽어보기
이 외에도 장고에서는 다양한 오류 상황에 대해 예외 처리를 할 수 있습니다. 공식 문서를 통해 활용할 수 있는 예외 처리를 확인할 수 있습니다.
'Django' 카테고리의 다른 글
장고 추상 모델 클래스 생성과 상속 방법 (0) | 2022.01.21 |
---|---|
장고 암호화 인증 인가 처리: bcrypt, JWT 사용 방법 (0) | 2022.01.19 |
장고 데이터 모델 작성과 CRUD 테스트 방법 (0) | 2022.01.11 |
장고 URL 추가 및 Views에서 URLconf 요청 응답 처리 방법 (0) | 2022.01.10 |
장고 URL과 Views의 개념 및 역할 (0) | 2022.01.10 |