Django Errors(과제하다가 만난 에러들)

김기현·2022년 2월 19일
0
post-thumbnail

에러꺼조;;😨// westargram 과제를 하다가 만난 에러를 해결하는 블로그입니다.

1. Method Not Allowed

특정 보기에서 특정 HTTP 메서드를 호출하도록 허용하지 않았거나, 잘못된 URL을 호출하고 있음을 의미합니다. URL을 수정했고, 맨 처음 value가 empty일 때 POST시 validation 오류를 내보냈을 때 해당 에러를 반환하였습니다.

2. TypeError : expected string or bytes-like object

추출을 할 리스트가 string형식이 아닐 때 해당 에러를 반환합니다.
정규표현식을 사용하여 match를 했는데, 타입에러(TypeError: expected string or bytes-like object)가 떴습니다. 다음은 에러가 발생했던 코드입니다.
users/validators.py

import re

# 이메일 validate
def validate_email(email):
    email_regex = r'^[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
    return re.match(email_regex, email)

# 비밀번호 validate
def validate_password(password):

	password_regex = r'^(?=.*[A-Za-z])(?=.*\d)(?=.*[$@$!%*#?&])[A-Za-z\d$@$!%*#?&]{8,}$'
    return re.match(password_regex, password)

users/views.py

import re
import json

from django.http  import JsonResponse
from django.views import View

from users.models import User
# validator.py에서 function 가져오기
from users.validators import validate_email, validate_password

class SignUpView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)

            email        = data['email']
            password     = data['password']
            phone_number = data['phone_number']

            if not re.match(PASSWORD_VALIDATION, email):
                return JsonResponse({'Message' : 'Invalid Email'}, status = 400)
            
            if not re.match(PASSWORD_VALIDATION, password):
                return JsonResponse({'Message' : 'Invalid Password'}, status = 400)
            
            if User.objects.filter(email = email).exists():
                return JsonResponse({'Message' : 'Email Already Exist '}, status = 400)

이미 validators.py에선 주어진 email을 email_regex에 match하고 리턴을 하는데 users/views.py의
SignUpView에서 또 if not re.match(PASSWORD_VALIDATION, email):로 중복검증을 시도합니다.
그래서 다음의 블로그에서 시도하라는대로 if not re.match(PASSWORD_VALIDATION, str(email)):을 했지만 에러는 사라지지 않았습니다....

따라서 다음의 코드로 중복된 기능을 사용하지 않도록 하니 에러는 해결되었습니다.

class SignUpView(View):
    def post(self, request):
        try:
            data = json.loads(request.body)

            email        = data['email']
            password     = data['password']
            phone_number = data['phone_number']

            # 'if not re.match(PASSWORD_VALIDATION, password):'은 중복된 기능을 사용하며 에러 유발
            if not validate_email(email):
                return JsonResponse({'Message' : 'Invalid Email'}, status = 400)
            
            if not validate_password(password):
                return JsonResponse({'Message' : 'Invalid Password'}, status = 400)
            
            if User.objects.filter(email = email).exists():
                return JsonResponse({'Message' : 'Email Already Exist '}, status = 400)

3. django.db.utils.DataError

django.db.utils.DataError: Data too long for column 'phone_number'라는 에러...

from django.db import models

class User(models.Model):
    first_name   = models.CharField(max_length=50)
    last_name    = models.CharField(max_length=50, null=True)
    email        = models.EmailField(max_length=50, unique=True)
    password     = models.CharField(max_length=100)
    phone_number = models.CharField(max_length=15)

    .
    .
    .

휴대폰번호는 보통 010-0000-0000의 형태로 총 길이는 숫자 11자리 + 하이픈 2자리로 총 13자리이기 때문에 max_length=15로 property를 지정해줬더니 에러를 내뱉습니다 ㅠㅠ

max_length는 최대길이(문자 수) byte로 정의합니다. (utf-8에서 한글은 3 byte) 바이트로 변환하면서 max_length에서 지정한 바이트를 초과했기 때문에 발생한 에러로 보입니다.. 그래서 max_length를 더 크게 지정해였습니다.

from django.db import models

class User(models.Model):
    first_name   = models.CharField(max_length=50)
    last_name    = models.CharField(max_length=50, null=True)
    email        = models.EmailField(max_length=50, unique=True)
    password     = models.CharField(max_length=100)
    phone_number = models.CharField(max_length=20)
    .
    .

Django - django.db.utils.ProgrammingError:

휴대폰 번호의 max_length를 늘려주고 바로 view로 넘어가서 POST를 하니 Django - django.db.utils.ProgrammingError: relation "폴더" does not exist라는 에러가 발생하였습니다. migrate를 하지 않았으니 migrate를 해줍니다.

꼭 model을 수정했으면 makemigrations && migrate하는 것을 잊지 않아야겠습니다..

400에러

Bad Request: /users/signup
"POST /users/signup HTTP/1.1" 400 28 라며 내뱉는 에러....

저 에러는 직접 만든 정규식에 유효하지 않는 입력값을 넣어서 발생한 에러입니다. 유효한 정규식 value를 입력합니다...!

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글