2016-11-30 38 views
1

我目前正在運行Django應用程序,SESSION_ENGINE配置爲user_sessions.backends.db(我正在使用this外部庫)。 Django自己的內置會話非常棒,但所有數據都隱藏在base64編碼數據中。這個庫使會話對象像其他ORM對象一樣可訪問。將會話數據從自定義後端遷移到後端緩存(Django)

我需要刪除我對這個庫的依賴;將SESSION ENGINE更改爲緩存以提升性能。

我的挑戰是在不破壞當前會話數據的情況下進行此更改,這就是這個問題的含義。鑑於其性質,圖書館自然不包括db以外的後端,因此我必須對其進行擴展。

我該如何解決這個問題?例如,在我的腦海中:i)我應該看看這個庫保存會話數據的db表的內容,ii)在每次寫入時寫入將數據保存到高速緩存的功能,iii)轉移到讀取從緩存(用db作爲後備)。

這聽起來是對的嗎?因爲這是一個相當複雜的任務,所以在這個時候,我會很樂意知道任何不該做的事情。提前致謝。

+0

下面是我該怎麼做:弄清楚如何將當前會話數據序列化到Django的會話數據中。查看您是否可以將當前會話ID直接映射到Django會話框架使用的密鑰。將所有會話數據遷移到新的會話存儲。編寫一箇中間件,將舊會話引擎的Cookie密鑰轉換爲新密碼,使其對Django的會話引擎透明。 (如果無法重新使用密鑰,請將地圖old_key => new_key寫入Django的緩存並進行查詢)。 – Tiago

回答

0

在我看來,最好的方法是將所有當前會話數據遷移到本地Django會話框架,只需重新序列化所有會話數據,保留相同的會話ID。

首先,我想清楚Session框架如何序列化數據。例如,在Django 1.10.4,here's what you should be looking for: django/contrib/sessions/backends/base.py#L96上。

然後,我會寫一個轉換器,從數據庫中讀取當前會話數據並將其轉換爲本地數據。

我不確定會話ID是如何工作的,但看起來他們使用的是相同類型的ID,所以應該可以這樣做,然後將SESSION_ENGINEMIDDLEWARE_CLASSES更改回到Django默認值和它應該管用。

相關問題