(05.15) 수정됨.
구글 애널리틱스처럼 방문 통계에 세션 정보를 연결해 세션에서 방문한 페이지를 확인할 수 있게 해볼까 생각을 했었다.
먼제 데이터를 확인하기 위해 데이터베이스의 세션 테이블을 확인해보았는데, 세션이 10개만 있을 뿐이었다.
버그?
다행인건 내가 설정을 잘못하거나 코드에 문제가 있던 것은 아니었다.
단지 장고에서는 모든 방문자에게 세션을 부여하지 않을 뿐이었다.
정확히는 세션에 변화가 없는 경우 세션을 따로 만들지 않고 있었다.
세션 확인하기
views.py나 middleware에서 다음과 같이 request의 session 정보를 호출할 수 있다.
from django.http import HttpRequest
def view(request: HttpRequest):
# 세션 변경 여부 확인
print(f'{request.session.modified=}')
# 세션 키 확인
print(f'{request.session.session_key=}')
anonymous user에게는 세션이 부여되지 않는다.
사이트 방문자가 로그인하지 않은 경우, session key는 None이다.
세션이 생성되지 않고, 따로 관리하지도 않는 것이다. 만약 익명 방문자에게 세션을 부여하고 싶다면, 세션을 만들어주면 된다.
다음과 같은 미들웨어를 만들고, settings.py의 MIDDLEWARE에 생성한 미들웨어를 추가한다면 모든 방문자에게 세션을 부여하게 된다.
from django.http import HttpRequest
from django.utils.deprecation import MiddlewareMixin
class SessionMiddleware(MiddlewareMixin):
def process_request(self, request: HttpRequest):
# 세션 부여
if not request.session.session_key:
request.session.create()
# 세션 변경 여부 확인
print(f'{request.session.modified=}')
# 세션 키 확인
print(f'{request.session.session_key=}')
return
SESSION_SAVE_EVERY_REQUEST
관련 내용을 찾아보다가 settings.py에서 "SESSION_SAVE_EVERY_REQUEST = True"를 선언하면 모든 요청(request)에서 세션을 만든다는 내용을 찾아볼 수 있었다.
기본값은 False인데, 테스트해본 결과로는 이것을 설정하더라도 수동으로 세션을 생성해 주어야만 했다.
SESSION_SAVE_EVERY_REQUEST 공식 문서