티스토리 뷰

문제점 : login에서 값을 입력하면 자꾸 값을 못읽어들이고 입력정보를 확인하라는 메세지만 뜬다. 

class UserLoginView(BaseView):
    def post(self, request):
        username = request.POST.get('username', '')
        if not username:
            return self.response(message='아이디를 입력해주세요.', status = 400)
        
        password = request.POST.get('password', '')
        if not password:
            return self.response(message = '비밀번호를 입력해주세요.', status = 400)

        user = authenticate(request, username = username, password = password)
        print(username, password, user)

        if user is None:
            return self.response(message = '입력정보를 확인해주세요.', status = 400)

        login(request, user)
        return self.response()

문제 해결 과정 

1. 다음과 같이 아이디와 비밀번호는 정확하게 인식되지만 왜 때문인지 user에 정보가 담기지 않는다.

user 가 계속 None 으로 정의되면서  "입력정보를 확인해주세요" 라는 메세지와400 bad request 가 뜬다. 

 

2. 처음에는 UserLoginView 자체의 문제라고 생각하여 authenticate 함수가 오류의 주원인이라고 단정짓고 해당 함수의 파라미터 값, 리턴값을 찾아봤다. 하지만 전혀 문제되는 것이 없었다.

 

3. 400 bad request 는 전달 경로가 잘못되어서 발생하는 것이므로 request 값에 대해서 다시 살펴봤다. templates 내의 login 에서 views.py로 넘어오는 경로가 이상한가 싶어서 이렇게 바꿔보고 저렇게도 바꿔보고 슬래시 방향도 바꿔보고 그렇지만 경로는 틀리지 않았다.

 

문제 해결

정말 모든 stackoverflow 다 뒤진거같은데 해결을 못해서 정말 너무 짜증났는데 admin 사이트에서 다시 확인을 해보니 UserCreateView 클래스 내에서 email, username, password 가 제대로 입력되지 않아서 user is None 이 True가 되는 것이었다.  그래서 class UserCreateView에서 user를 정의하는 부분을 수정했다.

 

Before : user = User.objects.create_user(username, email, password) 

After : user = User.objects.create_user(username = username, email = email, password = password)

class UserCreateView(BaseView):
    @method_decorator(csrf_exempt)
    def dispatch(self, request, *args, **kwargs):
        return super(UserCreateView, self).dispatch(request, *args, **kwargs)

    def post(self, request):
        username = request.POST.get('username', '')
        if not username :
            return self.response(message = '아이디를 입력해주세요.', status = 400)

        password = request.POST.get('password', '')
        if not password:
            return self.response(message = '비밀번호를 입력해주세요.', status = 400)

        email = request.POST.get('email', '')
        try:
           validate_email(email)
        except ValidationError:
            return self.response(message = '올바른 이메일을 입력해주세요.', status = 400) 

        try:
            user = User.objects.create_user(username = username, email = email, password = password)
        except IntegrityError:
            return self.response(message = '이미 존재하는 아이디입니다.', status = 400)
            
        return self.response({'user.id' : user.id})

 

느낀 점

항상 오류가 발생하면 에러 내용을 구글링하거나 문제가 되는 변수를 프린트하여 값을 확인하곤 했는데, admin 사이트에서 값이 잘 적용되었는지, 올바르게 저장되었는지 먼저 확인해야겠다는 생각을 했다.

댓글