Django 로 게시판 만들기(19). 게시판 관련 예외처리 보완하기

.·2020년 7월 28일
0

게시판만들기

목록 보기
19/21

로그인을 시도할 때 아이디와 (username) 일치하는 게 없다면 어떻게 될까?

회원가입을 시도하지 않은 임의의 아무 username 을 갖다 붙이고 로그인을 시도했다.
그랬더니 위의 화면이 나온다.
"BoardMember matching query does not exist."

이 DoesNotExists 라는 불편한 창이 뜨므로 예외처리를 해 주어야 한다.

1. member/forms.py 에서 username 과 일치하는게 없을 때의 예외처리

로그인 시도 시, username 과 일치하는 경우에 대해서만 코드가 작성되어 있다.

즉, 로그인을 시도할 때 아이디와 (username) 일치하는 게 없을 때의 예외처리가 되어 있지 않은 상태이다.

🤡 try, except 예외처리

if username and password:
    try:
        member = BoardMember.objects.get(username=username)
    except BoardMember.DoesNotExist:
        self.add_error('username', '아이디가 없습니다!')
        return
        # 예외처리를 하고 return 을 실행해서 바로 아래 코드를 실행하지 않고 빠져나오게 한다.

    if not check_password(password, member.password):
        self.add_error('password', '비밀번호가 다릅니다!')
    else:
        self.user_id = member.id

2. board/views.py 없는 게시물에 대한 접근 예외처리 하기

게시글을 클릭해서 들어오면 좋겠지만 (아직 클릭하게 만들지 않아서..), 사용자가 주소를 직접 입력해 타고 들어오는 경우, 가령 나는 게시물을 첫번째부터 여섯개 까지 만들었다.
이 처음 여섯개의 게시물은 http://127.0.0.1:8000/board/detail/1 의 주소를 직접 입력해 타고 들어갈 수 있다.

그러나 아래 경로로 접근한다면 어떻게 될까?

http://127.0.0.1:8000/board/detail/7

이렇게 없는 게시물에 대한 접근에 관련한 예외처리가 필요하다.

🤡try, except 예외처리하기

def board_detail(request, pk):
    try:
        board = Board.objects.get(pk=pk)
    except Board.DoesNotExist:
        raise Http404('게시글을 찾을 수 없습니다')
        # 게시물의 내용을 찾을 수 없을 때 내는 오류 message.

    return render(request, 'board_detail.html', {'board':board})

상단에 from django.http import Http404 해주자.

board/views.py 로그인 하지 않은 사용자가 게시글을 쓰려고 할 때의 예외처리하기

board_write() 함수에서 쓰기 일때 자동으로 작성자 아이디가 들어가게 되어 있다.

그런데 만약에 "로그인 하지 않은 사용자가 게시글을 쓰기 위해 주소로 접근한다면" 어떻게 될까?

위의 상황과 마찬가지 이므로 애초에 접속 자체를 막는 코드를 입력해야 한다.

코드 상에서 request.method 가 POST 인지를 확인하기 전에, 사용자가 있는지 (로그인을 해서 세션에 지정한 'user' 키를 불러 올 수 있는지) 먼저 확인해 봐야 한다.

def board_write(request):
    if not request.session.get('user'):
        return redirect('/member/login/')
    # 세션에 'user' 키를 불러올 수 없으면, 로그인하지 않은 사용자이므로 로그인 페이지로 리다이렉트 한다.

    if request.method == "POST":
        form = BoardForm(request.POST)

        if form.is_valid():
            user_id         = request.session.get('user')
            member          = BoardMember.objects.get(pk=user_id)

            board = Board()
            board.title     = form.cleaned_data['title']
            board.contents  = form.cleaned_data['contents']
            board.writer    = member
            board.save()

            return redirect('/board/list/')

    else:
        form = BoardForm()

    return render(request, 'board_write.html', {'form':form})

로그인한 사용자만 게시글을 쓸 수 있는 접근이 가능해 졌다.

로그아웃 후 아래 페이지로 가면 로그인 페이지로 리다이렉트 된다.

profile
.

0개의 댓글