• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

blueprint 상새보기와 글작성으로 이동

20.04.22 18:03 작성 조회수 229

1

현재 blueprint 쪽 하고있습니다.

필요한 import 다 추가하고

app 을 blueprint트로 변경 url.for를

member나 board를 다 추가하고 테스트 하던중

list에서 상세로 들어가거나 글작성으로 들어가면 

login 하라고 뜹니다.  강의에서는 바로 글작성이나 상새보기로 이동하던데

그리고 login을 하면 아래와 같이 뜨거나 이동을 하지 않습니다.

검색은 되고 list page지 뜨는것까지는 확인하였는데

중간에 login 때문에 상새보기 글작성 수정 삭제를 확인하지 못하였습니다.

그리고 회원가입도 확인해봐야 하는것 같은데 어디가서 확인해야되는지 모르겠습니다

'

답변 3

·

답변을 작성해보세요.

0

일단... 로그인되는 과정에 대한 이해를 좀 더 하셔야할 필요성이 있어 보입니다.

일단 로그인이 되었는지 안되었는지를 프로그램이 판단하는 기준은 session 이라는 객체에 email 이란 키에 값을 설정하면서 성립됩니다.  session 은 dict 형 객체이므로 키와 값의 한쌍으로 이루어지며 키가 중복되지 않는한 여러개의 키를 갖을 수 있습니다.

if check_password(data.get("pass"), password):
    session["email"] = email
    session["name"] = data.get("name")
    session["id"] = str(data.get("_id"))
    session.permanent = True
    if next_url is not None:
        return redirect(next_url)
    else:
        return redirect(url_for("board.lists"))
else:
    flash("비밀번호가 일치하지 않습니다.")
    return redirect(url_for("member.member_login"))

강좌 내용중 로그인을 처리하는 위의 코드를 보시면 패스워드가 일치하는 경우 session 객체에 email, name, id 등의 키와 값을 설정하게되면서 로그인 한 사용자라고 판단하게 됩니다. session 객체는 

from flask import session

모듈의 초기화 파일인 __init__.py 에 import 되어있고 이는 사이트 전역적으로 사용할 수 있는 객체입니다. 

@blueprint.route("/list")
def lists():
    print(session.get("email"))
    page = request.args.get("page", 1, type=int)
    limit = request.args.get("limit", 10, type=int)

    search = request.args.get("search", -1, type=int)
    keyword = request.args.get("keyword", "", type=str)

제가 print(session["email"]) 을 출력해보라고 말씀드린건 예를 들어 위와 같이 게시판의 리스트 함수 맨 상단에 print를 출력을 하게 하면 로그인이 정상적으로 된 상황이라면 사용자의 이메일 주소값이 출력되게 될테니까 이렇게 되면 적어도 "로그인이 프로세스에는 문제가 없다" 라는 결론을 낼 수 있기 때문이고 이런식으로 오류의 범위를 점점 줄여 나가면서 정확이 어떤 문제가 발생했는지를 찾아보는 방법에 대한 말씀을 드린것 입니다.

그러나 말씀하신대로 print(session["email"]) 을 했는데 오류가 났다는건 해당 세션(현재 접속중인 브라우저)은 로그인이 되지 않았다는 의미가 됩니다. 로그인 프로세스에 문제가 있는건지 아니면 로그인 하지 않은 사용자로 위의 테스트를 진행하신건지 알 수 없기 때문에 뭐라고 드릴 말씀이 없습니다. 오류를 확인하기 위해선 100% 확실한 조건을 두고 하나하나 범위를 줄여나가야 합니다. 확실한 조건이 아닌상태에서의 테스트 결과는 절대 수용할 수 없는 결론입니다.

그리고 session["email"] 과 session.get("email") 의 차이는 session은 dict 형 객체이기 때문에 session["email"] 은 키 값을 직접 접근하는 방식으로 session에 email 이라는 키가 존재하지 않으면 오류가 발생합니다. 대신 seesion.get("email") 역시 session에서 email 이란 키의 값을 요청하지만 만약 존재하지 않는다면 오류가 발생하지 않고 None 이 반환됩니다. 

오류의 내용을 보아 개인적으로 추측컨데 아마 기존 코드에서 blueprint로 수정되는 과정에서 주소값이 누락된 곳이 여러곳 있지 않을까 생각해 봅니다. 물론 확실한 내용은 아니니 참고만 하셔야 할 듯 한 부분이며 기존 코드의 주소를 url_for 함수로 대체하고 대체된 주소가 login 에서 member.login 처럼 정상적으로 모두 수정된것인지 확인해보셔야 할 듯 합니다.

0

nicolas83님의 프로필

nicolas83

질문자

2020.04.24

print(session["email"])

을 입력하고 실행해도 에러가 납니다.

그리고 정확이 어디에 넣고 테스트를 해봐야 하는건지 정확한 위치를 알려주시면 고맙겠습니다.

0

일단 올려주신 스샷에서 보이는 문제는

위 이미지에서 보면 blueprint 로 변경해서 /member/login 인데 /login 으로 시도해서 404 에러가 뜨는걸 볼 수 있습니다. 아마도 예측컨데 이렇게 수정되지 않은 구간이 있어서 생기는 문제로 생각됩니다.

그리고 우선적으로 로그인이 제대로 되었는지도 확인해봐야 할 부분입니다. 

print(session["email"])

로그인이 정상적으로 되었다면 위의 코드를 어느 페이지에서든 출력해보면 어떤 값이 설정되어있을테고 로그인이 되어있지 않은 상황이라면 None 값이 출력될것입니다.