인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

남박사의 파이썬으로 실전 웹사이트 만들기

댓글 기능을 Ajax로 수정하기

ajax로 comment 작성 문의 드립니다.

작성

·

217

1

댓글을 작성하는 함수입니다.

function addComment() {
	$.ajax({
		url: "{{ url_for('board.comment_write') }}",
		cache: false,
		type: 'post',
		data: $("#commentForm").serialize(),
		success: function(data) {
			$('#comment').val('');
			get_comment_list();
			console.log('가나다');
		},
		error : function(request, status, error) {
			var msg = "Error : " + request.status + "<br>";
			msg += "내용 : " + request.responseText + "<br>" + error;
			console.log(msg);
		 }
	});
}

코드를 작성하고, 코멘트를 작성했는데, 계속 코멘트가 안먹혀서, 한참을 살펴보니,

코드를 작성하는 와중에, 로그인이 풀렸었습니다.

로그인이 안된상태라면

@login_requreid 데코레이터로 인하여,

로그인 페이지로 넘어가야 하는데,

ajax로 commet_write를 접근해서 그런지

로그인 페이지로 가지지 않습니다.

 

ajax로 아닌 상황에서는 로그인 페이지로 잘 이동하기때문에 문의글 남겨요

 

예를 들어서 로그인안하고

글작성 클릭하면, 로그인 페이지로 잘 넘어 갑니다.

 

ajax일때는 login_required가 작동하지 않는 것일까요?

정확히 말하면 > member/login으로 이동하지 않습니다

아래 코드는 vscode 터미날 창 내용입니다

192.168.1.13 - - [12/Oct/2022 20:43:53] "GET /member/login?next_url=http%3A%2F%2F192.168.1.13%3A9000%2Fboard%2Fcomment_write HTTP/1.1" 200 - 

 

login_required 코드도 남겨봅니다.

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if session.get('id') is None or session.get('id') == '':
            print(f'로긴 리콰이어드의 request.url : {request.url}')
            return redirect(url_for('member.member_login', next_url=request.url))
        return f(*args, **kwargs)
    return decorated_function

 

login_requried 함수가 잘 동작해서, 로긴 페이지로 이동하게 하려면 어떻게 해야 할까요?

 

답변 2

1

남박사님의 프로필 이미지
남박사
지식공유자

좀 더 추가적인 내용을 붙이자면..

 

Ajax는 자바스크립트를 이용한 하나의 통신방법이며 클라이언트 사이드에서 일어나는 일입니다. 그렇기 때문에 말씀하신것과 같은 상황에서 댓글을 작성할때 댓글의 데이터를 Ajax를 통해 전달을 하는 것 일뿐 로그인이 되었는지 안되어있는지는 Ajax는 관여하지 않고 관여할 수가 없습니다.

그래서 어떤 장치를 필요로 하는데 이게 생각해보면 재미있는 상황이 많이 있습니다.

예를 들어 Ajax를 호출하기전에 어떤 처리를 했다 하더라도 만약 Ajax를 호출하기 전에는 로그인 상태여서 정상적으로 Ajax가 실행되었다 할때 만약 그 찰라(ms단위에서)에서 로그인이 해지가 된다면??

이런 경우가 일어나지 않으리라고 100% 장담할 수 없다면 그 일은 무조건 언젠가는 일어나게 됩니다. 따라서 결론적으로 로그인이 되었는지 안되어있는지는 Ajax호출전에 확인을 당연히 해야겠지만 결국 서버쪽에서 한번 더 확인을 해야 하고 만약 서버쪽에서 로그인이 되지 않은 사용자의 데이터가 넘어왔다면 이에 따른 예외코드를 만들어서 서버가 다시 클라이언트쪽으로 전달해야 합니다.

그래서 Ajax를 호출하고 서버에서 어떤 임의의 리턴코드를 받아서 정상적으로 댓글이 작성되었는지 아니면 로그인이 해지되었는지 아니면 서버에 어떤 문제가 발생해서 정상처리가 되지 않았는지를 판단하고 그 판단에 맞는 메세지를 사용자에게 보여줘야 합니다.

 

도움이 되셨길 바랍니다.

말씀하신것과 같은일이 일어날수있는걸 생각 못했네요.

말씀해주신 내용들을 생각해보며 더욱 성장할수있는 계기가 된거 같습니다

상세하게 답변 주셔서 감사합니다!

0

질문이 해결되어서, 삭제하려고 하는데 삭제가 안되네요

자문 자답합니다.

ajax실행전에

session['id'] 가 있는지 확인하여

없으면 , member.member_join으로 이동하는 코드를 작성하면됩니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기