로그인이 안되어있으면 '로그인 후 이용해주세요' 라고 잘 작동하는데 로그인이 되어있어도 '로그인 후 이용해주세요'라고 뜹니다.
세션 문제인 건가요? 4시간동안 이 문제에 대해 고민을 계속했는데도 코딩실력이 한없이 부족해서 해결하기가 어렵습니다..
_song.html 세션 문제?
haru2175
작성일
24.10.18 11:51
조회수
84
파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트 (장고 4.2 기준)
09-01 쿠키와 세션을 활용한 상태 유지 - 쿠키
강의실 바로가기
댓글 2
안녕하세요.
보내주신 프로젝트를 확인해봤습니다.
이 페이지를 보시면, 페이지 상단에서는 로그아웃 버튼이 보여지잖아요. 즉 index.html 템플릿 단에서는 인증 확인이 되고 있는 상황입니다. user.is_authenticated 값 확인이 되고 있습니다. 그러니, 로그인이 잘 된 상황이 맞습니다. 로그인뷰/로그아웃 뷰에서 직접 쿠키 값을 설정하실 필요가 전혀 없습니다. 장고 기본의 LoginView/LogoutView에서 관련 처리를 모두 하고 있습니다.
그런데, 그 아래에서 index.html 템플릿에서 include하는 _song.html 에서는 "로그인 후 이용해주세요." 라고 나오죠. index.html 템플릿에서는 참조가 되는 값이 _song.html 템플릿에서는 참조가 되지 않는다??? 이는 index.html 템플릿에서 참조하는 user 객체가 _song.html 템플릿에는 전달이 안 되는 상황입니다.
{% if user.is_authenticated %} 에서 거짓 판정을 받을려면,
- user 객체가 있고, is_authenticated 속성이 False를 반환할 때도 있고
- user 객체가 없어서 None으로 판정을 받아서 일 수도 있습니다. <= 지금은 이 경우입니다.
지금과 같은 경우를 디버깅하실 때, 템플릿에 아래의 코드를 넣어주시면
아래와 같은 화면을 확인하실 수 있습니다.
index.html 템플릿의 값이 _song.html 템플릿으로 전달되지 않았다면, 의심해볼 부분은 include 하는 템플릿 태그입니다. 뒤에 only 가 붙어있죠. 이는 with를 통해 전달하는 값만 _song.html 템플릿에 전달할 뿐, index.html 템플릿에서 참조하는 다른 값들은 전달하지 않습니다. 그래서 user 객체도 전달되지 않은 것입니다.
1) only 인자를 제거해주시거나
2) with song=song user=user only 처럼 user 값도 명시적으로 전달해주시면
_song.html 템플릿 내에서도 user 값을 전달받음을 확인하실 수 있습니다.
--
구글링은 유사한 키워드의 어떤 웹 문서를 찾는 수단일 뿐, 문제 해결의 방법은 아닙니다. 게다가 구글링 시에 현 상황의 모든 맥락을 담을 수도 없잖아요. 그러니 찾는 해결책을 구글링을 통해 찾는 것은 대개 어렵습니다.
질문에, 검색어에 현재 문제의 핵심을 담을려면 코드를 차근차근 살펴보며 코드를 이해할려는 노력이 필요할 것이구요.
저도 혹은 고수라 불리는 사람들도 학선님께서 겪으시는 시행착오의 과정을 지금도 겪습니다. 개발자의 숙명이고, 이러한 과정들을 즐기는 사람들이 개발자로서 남게 되는 듯 합니다.
너무 조급해하지 마시구요. 조급함은 성장에 아무런 도움이 되지 못합니다.
같이 차근차근 성장해보시죠. 화이팅입니다. :-)
답글
이진석
2024.10.18그리고, django-debug-toolbar를 통해서도 _song.html 템플릿에서 사용할 수 있는 값들(context data) 목록을 아래와 같이 확인할 수 있습니다. 보내주신 코드에서는 _song.html 템플릿에서 song 값만 있을 뿐, user 값은 없었구요. 제가 알려드린 방법을 적용하시면 user 값도 확인가능하실 겁니다. :-)
haru2175
2024.10.18정말 감사드립니다. 궁금한게 있습니다.
1)
only 인자를 제거해주시거나 , 명시적으로 only 해서 user=user 객체를 전달 하거나 둘 중 어떤 차이 인지를 잘 이해를 못하겠습니다..
어떤 경우는 명시적으로 객체를 전달해줘야하는지 어떤 경우는 only 인자를 그냥 제거 해주든지 경우의 수가 2가지인데
이 차이점을 잘 모르겠습니다.
2)
디버깅은
index.html 에 user 객체는 있지만
'user': '<SimpleLazyObject: <User: admin>>'}
_song.html 에
'song': <Song: Song object (1)>} 밖에 없다. 즉. user 객체가 안 들어왔다는 뜻 일까요?
이해를 제대로 하고 있는건가 싶어서 다시 되물어봤습니다.
"구글링은 유사한 키워드의 어떤 웹 문서를 찾는 수단일 뿐, 문제 해결의 방법은 아닙니다. 게다가 구글링 시에 현 상황의 모든 맥락을 담을 수도 없잖아요. 그러니 찾는 해결책을 구글링을 통해 찾는 것은 대개 어렵습니다.
질문에, 검색어에 현재 문제의 핵심을 담을려면 코드를 차근차근 살펴보며 코드를 이해할려는 노력이 필요할 것이구요.
저도 혹은 고수라 불리는 사람들도 학선님께서 겪으시는 시행착오의 과정을 지금도 겪습니다. 개발자의 숙명이고, 이러한 과정들을 즐기는 사람들이 개발자로서 남게 되는 듯 합니다.
너무 조급해하지 마시구요. 조급함은 성장에 아무런 도움이 되지 못합니다.
" 이 부분은 가슴 깊이 새겨 듣겠습니다. 정말 감사 드립니다.
이진석
2024.10.18index.html 템플릿은 부모 템플릿으로서 include 를 통해 자식 템플릿을 _song.html 을 활용합니다.
이때 index.html 템플릿에서 사용하는 모든 context data들이 _song.html 로 자동 전달되는 데요. with 를 통해 추가로 전달할 값을 지정할 수 있습니다.
이때 only 를 지정하시면 index.html 템플릿의 모든 값이 자동 전달되지 않고, with를 통해 지정한 값만 전달되게 됩니다.
haru2175
2024.10.19감사합니다!
안녕하세요.
현재 코드만 봐서는 별 문제가 없어 보입니다.
장고 기본 설정으로 템플릿에서는 현재 로그인 User 객체가 user 이름으로 제공되구요. User 모델에는 is_authenticated 속성을 통해, 로그인 여부를 확인합니다.
그리고, 세션의 경우, 기본 설정으로 잘 동작하니깐요. 문제가 없을 텐데 말이죠.
혹시 로그인이 안 되었는 데 로그인이 되었다라고 오해하신 상황은 아니실까요? 현재 프로젝트를 help@pyhub.kr 메일로 보내주시면, 위 코드의 동작 여부를 확인해보겠습니다.
화이팅입니다. :-)
답글
haru2175
2024.10.18네 보내겠습니다.. 감사합니다.. 아직까지도 구글링 다 해보고 알아보고 했는데도.. 안되니 정신이 많이 혼미해지네요... 잘해지고 싶은데 시간만 보내는거같고...