2012-05-17 45 views
3

我無法訪問我自定義的Django中間件中的session_key。我嘗試使用訪問它:Django:如何訪問中間件中的session_key

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 matching query does not exist. 

我已經把我的中間件在MIDDLEWARE_CLASSES結束後django.contrib.sessions.middleware.SessionMiddleware在我settings.py文件。

我可以在中間件中設置會話密鑰,但看起來好像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

當你擊中數據庫時,你真的有會話密鑰嗎?新會話僅在會話中間件的'process_response'中創建 - 因爲它們需要存儲視圖中的任何內容,並且在視圖完全處理之前無法完成此操作。 – ilvar

回答

3

我設法讓它工作。事實證明,通常只有在完成頁面呈現後纔會保存會話。

我設法過早地保存在我的中間件的會話中使用:

request.session.save() 

然後我可以救我的模型一樣(注意會話後_id,它允許您設置我的情況foreign key using only an integer or varchar):

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

我能用以下方法做到這一點,它對你有用嗎?

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

如果不是,可能@ilvar是正確的,您試圖訪問該會話之前,它是活動。

相關問題