2012-05-17 4 views
3

내 맞춤 Django 미들웨어에서 session_key에 액세스 할 수 없습니다. 내가 사용하여 액세스하려고 : 내 settings.pyMIDDLEWARE_CLASSES의 끝에서 내 미들웨어를 넣어 후 django.contrib.sessions.middleware.SessionMiddlewareDjango : 미들웨어의 session_key에 액세스하는 방법

Session matching query does not exist. 

:

session = Session.objects.get(pk=request.session._session_key) 

또는

session_key = request.COOKIES[settings.SESSION_COOKIE_NAME] 
session = Session.objects.get(pk=session_key) 

내가 오류 파일.

미들웨어에서 세션 키를 설정할 수 있지만 전체 페이지가 표시된 후에 session_key가 생성/액세스 될 수있는 것처럼 보입니다. 페이지가 처음으로 표시 될 때 {{ request.session.session_key }}은 내 서식 파일에 None을 반환합니다. 페이지를 새로 고침하면 session_key이 표시됩니다. session_key에 액세스하는 방법에 대한 정보는 매우 환영합니다.

+2

왜 그 검색어를 사용 하시겠습니까? 왜'request.session'에 직접 액세스하지 않는가? –

+0

다음과 같은 django_session 테이블을 참조하는 테이블이 있습니다.session = models.ForeignKey (Session) 예를 들어 request.session을 사용하여 인스턴스를 만들면 다음과 같은 오류가 발생합니다. " ":"Visitor.session "은"Session "인스턴스 여야합니다. 그래서 "세션"인스턴스를 얻기 위해 세션 테이블을 쿼리하려고합니다. –

+0

db를 치고있을 때 실제로 세션 키가 있습니까? 새로운 세션은 세션 미들웨어의'process_response'에서만 생성됩니다. 뷰에서 아무 것도 저장해야하기 때문에 뷰가 완전히 처리되기 전에 할 수 없습니다. – ilvar

답변

3

나는 그것을 작동시킬 수 있었다. 일반적으로 세션은 전체 페이지가 렌더링 된 후에 만 ​​저장됩니다.

request.session.save() 

그때처럼 내 모델을 저장 (내 경우에 foreign key using only an integer or varchar을 설정할 수 있습니다 세션 후 _id를주의) 수 :

나는 사용하여 내 미들웨어에 조기에 세션을 저장 관리

visitor = Visitor() 
visitor.session_id = request.session.session_key 
visitor.save() 
1

나는 이것을 다음과 같이 할 수 있었다. 그것은 당신에게 효과가 있는가?

Session.objects.get(session_key=request.session.session_key) 

그렇지 않으면 세션이 활성화되기 전에 액세스하려고 시도하는 것이 맞을 수도 있습니다.

관련 문제