ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Django] 뉴스 API 서버 구현 중, 트러블 슈팅
    Django 2024. 9. 14. 03:04

    트러블 슈팅

     

    01. 비밀번호 변경 기능 구현 후 Postman에서 테스트를 하는데 에러가 났다. 왜 안되지..

     

    dict를 불러올 수 없다구??🤔

     

     

    views.py 코드를 보면

     

    뭐가 문제일까..

    old_password와 new_password를 튜플로 묶어줘서 그런건가..

     

    리스트로 묶어주면?

    해결된다! 

     

     

    근데.. 비밀번호를 1로 바꿔도 변경이 된다..🫠

     

     

    구글에 파이썬 비밀번호 검증 정규표현식으로 검색했더니 여러가지가 정보가 쏟아졌다. 

     

    그 중 하나를 참고해 validators.py 에 로직을 추가해줬다.

     

    def changepasswordValidation(pwd):
    
        if len(pwd) < 8:
        # 비밀번호는 최소 8자 이상이어야 함
            return False
            
        elif re.search('[0-9]+', pwd) is None:
            # 비밀번호는 최소 1개 이상의 숫자가 포함되어야 함
            return False
            
        elif re.search('[a-zA-Z]+', pwd) is None:
            # 비밀번호는 최소 1개 이상의 영문 대소문자가 포함되어야 함
            return False
            
        elif re.search('[`~!@#$%^&*(),<.>/?]+', pwd) is None:
            # 비밀번호는 최소 1개 이상의 특수문자가 포함되어야 함
            return False
            
        else:
            return True

     

     

    그럼 뷰 코드에도 적용해줘야한다.

     

    # 비밀번호 변경
    class ChangePasswordView(APIView):
        permission_classes = [IsAuthenticated]
    
        def post(self, request):
            user = request.user
            serializer = ChangePasswordSerializer(user, data=request.data)
    
            if serializer.is_valid():
                old_password = serializer.validated_data["old_password"]
                new_password = serializer.validated_data["new_password"]
    
                if not changepasswordValidation(new_password):
                    return Response({"message": "비밀번호 형식에 맞지 않습니다. 비밀번호는 최소 8자 이상이어야 하며 1개 이상의 숫자를 포함해야 하며 1개 이상의 특수문자를 포함해야 합니다😊"}, status=status.HTTP_400_BAD_REQUEST)
    
                # 현재 비밀번호 맞는지 확인
                if not user.check_password(old_password):
                    return Response({"message": "현재 비밀번호가 맞지 않습니다🥺"}, status=status.HTTP_400_BAD_REQUEST)
    
                # 비밀번호 변경
                user.set_password(new_password)
                user.save()
    
                return Response({"message": "비밀번호 변경 완료👌"}, status=status.HTTP_200_OK)

     

    다시 테스트 해보면 잘 된다.

     

    ▼ 아래와 같이 조건에 맞게 바꿔줘야 변경된다. 

     


     

    02. Debug mode

     

    팀원 분들과 다 같이 테스트를 하는 도중 오류가 발생했다. 뭐 에러야 수도없이 발생하지만.. 왜 이렇게 뜨지🤔

     

     

     

    근데 왜 맨날 보던 이런 노란색 오류 화면이 아니라 왜 저렇게 뜨지.. 

     

     

    그러다 우린님이 settings.py 의 Debug 모드가 뭘로 되어있는게 물어보면서 문제가 해결되었다. 

     

    Debug True 변경해서 해결할 수 있었다👍

     


    Debug True 모드와 Debug False 모드

     

     

    1. DEBUG=True 모드 (개발 환경)

     

    DEBUG=True는 개발 중에 사용된다. 개발자에게 유용한 디버깅 정보를 제공하며, 에러가 발생하면 상세한 오류 페이지를 보여준다.

     

     

    설정방법 → settings.py에서 DEBUG 값을 True로 설정한다.

    DEBUG = True
    
    ALLOWED_HOSTS = []  # 개발 환경에서는 빈 리스트 또는 localhost를 사용
    • 에러 발생 시 Django가 상세한 오류 페이지를 표시한다.
    • 정적 파일(static files)을 자동으로 제공한다.
    • 보안에 취약할 수 있으므로 절대로 배포 환경에서는 사용하지 않아야 한다.

     

     

    2. DEBUG=False 모드 (배포 환경)

     

    DEBUG=False는 프로덕션(배포) 환경에서 사용됩니다. 보안을 강화하고, 상세한 오류 메시지를 외부 사용자에게 노출하지 않아야 한다.

     

    설정 방법

    settings.py에서 DEBUG 값을 False로 설정한다, 반드시 ALLOWED_HOSTS 설정에 서버의 도메인이나 IP 주소를 추가해야한다.

    DEBUG = False
    
    # 서버의 도메인 이름이나 IP 주소를 추가
    ALLOWED_HOSTS = ['로컬호스트주소', '도메인주소', 'IP address']

     

    • 오류 페이지: 에러 발생 시 Django는 내부 서버 오류(500)나 페이지를 찾을 수 없음(404) 등의 일반적인 에러 페이지를 표시한다.
    • 정적 파일 처리: 정적 파일은 자동으로 제공되지 않으므로 collectstatic 명령어를 사용해 별도로 서버에 정적 파일을 제공해야 한다.

     

     

     

    'Django' 카테고리의 다른 글

    Django DRF 개인과제 트러블 슈팅  (0) 2024.09.10
    [Django] API 문서화  (2) 2024.09.10
    [Django] AWS 배포 → Gunicorn, Nginx 설치 및 설정  (2) 2024.09.08
    Django, AWS 배포 (Deploy)  (2) 2024.09.06
    Django 외부 API 연동하기  (1) 2024.09.05
Designed by Tistory.