에러꺼조;;😨// westargram 과제를 하다가 만난 에러를 해결하는 블로그입니다.
특정 보기에서 특정 HTTP 메서드를 호출하도록 허용하지 않았거나, 잘못된 URL을 호출하고 있음을 의미합니다. URL을 수정했고, 맨 처음 value가 empty일 때 POST시 validation 오류를 내보냈을 때 해당 에러를 반환하였습니다.
추출을 할 리스트가 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)
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)
.
.
휴대폰 번호의 max_length를 늘려주고 바로 view로 넘어가서 POST를 하니 Django - django.db.utils.ProgrammingError: relation "폴더" does not exist
라는 에러가 발생하였습니다. migrate를 하지 않았으니 migrate를 해줍니다.
꼭 model을 수정했으면 makemigrations && migrate하는 것을 잊지 않아야겠습니다..
Bad Request: /users/signup
"POST /users/signup HTTP/1.1" 400 28
라며 내뱉는 에러....
저 에러는 직접 만든 정규식에 유효하지 않는 입력값을 넣어서 발생한 에러입니다. 유효한 정규식 value를 입력합니다...!