장고 HTTP 리퀘스트 유효성 검사 및 에러 메시지 작성 방법

2022. 1. 16. 16:03·Django
목차
  1. POST 요청 데이터 유효성 검사
  2. GET 요청 데이터 유효성 검사

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
  1. POST 요청 데이터 유효성 검사
  2. GET 요청 데이터 유효성 검사
'Django' 카테고리의 다른 글
  • 장고 추상 모델 클래스 생성과 상속 방법
  • 장고 암호화 인증 인가 처리: bcrypt, JWT 사용 방법
  • 장고 데이터 모델 작성과 CRUD 테스트 방법
  • 장고 URL 추가 및 Views에서 URLconf 요청 응답 처리 방법
휘 Hwi
휘 Hwi
개발자 성장 로그
  • 휘 Hwi
    개발자 로그: 변화를 위한 공간
    휘 Hwi
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • 101 (1)
      • Web | Internet (4)
      • HTML | CSS (4)
      • Python (9)
      • Django (20)
      • Javascript (0)
      • Node.js (0)
      • React (0)
      • React Native (0)
      • Database (1)
      • Git (1)
      • Terminal | Vim (1)
      • Auth | Security (4)
      • AWS (0)
      • Docker (0)
      • Kubernetest (1)
      • Deployment (1)
      • Project (2)
      • TIL (12)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    JWT 디코딩
    장고 URL
    JWT
    깃
    요소 상대 크기
    요소 크기 설정
    깃 에러 해결
    장고 프로젝트
    html
    파라미터
    깃 퍼블릭 키 등록
    정규 표현식
    장고 Views
    장고
    프로젝트 회고
    깃 오류
    요소 절대 크기
    TIL
    css
    HTTP POST 요청
    HTTP
    배포
    JWT 인코딩
    깃 ssh
    탭내빙
    target="_blank"
    새 탭에서 열기
    파이썬
    HTTP GET 요청
    함수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
휘 Hwi
장고 HTTP 리퀘스트 유효성 검사 및 에러 메시지 작성 방법
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.