2017-07-17 79 views
1

我正在創建一個Flask應用程序,要求每個請求都使用用戶傳遞給應用程序初始化其會話的一些數據。一旦他們傳遞了這些數據並初始化會話,我就想重複使用這些數據,直到他們的會話完成以填充請求,而不必爲每個請求傳遞數據。如何將會話的用戶數據存儲在Flask中?

我似乎無法找出最好的方法來做到這一點。將其存儲在會話變量中不起作用,因爲該數據只是被髮回給用戶,然後就像每次請求傳遞它一樣。將數據存儲在數據庫中看起來不是正確的選擇,因爲我需要在會話結束時拋棄它,並且在會話過期時看不到任何裝飾器...所以我是擔心我的數據庫最終會填滿所有這些來自初始化的數據,並且沒有保證在會話結束時刪除它們的方法。

有什麼建議嗎?

+0

https://pythonhosted.org/Flask-Session/也許? –

回答

1

這裏有兩個選項:存儲在客戶端上的會話或存儲在服務器上的會話。

要將它存儲在服務器上,您需要一個數據存儲。如果您的應用程序必須擴展到任何程度(包括多個uwsgi工作者),則必須使用分佈式存儲。如果你有Redis,那將是最好的選擇。查看Simon Fraser在註釋中發佈的Flask-Session示例來執行此操作。它將處理將會話對象存儲在數據庫中,並在需要時從中獲取值。它也處理大量的後端,因此無論你擁有哪種數據庫,都可能會使用它。

如果您不想使用後端會話,則必須使用客戶端會話。這是通過設置cookie來完成的 - Cookie自動附加到瀏覽器發送到您網站的大多數請求,因此您存儲在cookie上的值通常會回覆給您。 (這就是Facebook如何記住你是誰,沒有登錄每個頁面,事實上,Flask-Session是如何跟蹤WHICH會話來恢復的!)。爲了使其可靠,您必須簽署Cookie,以便用戶無法修改值 - Flask可以使用Session中的內置值來處理此問題,也可以使用Here中描述的更好的加密庫。如果您不希望用戶能夠看到這些值,或者您需要存儲大量數據(cookie的最大大小是有限的),則必須使用所有這些的服務器端版本。

+0

感謝您的回覆。我已經使用會話變量與餅乾,但問題是,我最終發送巨大20,000字節的數據爲每個請求,而不是實際存儲在會話端,並利用它後面的所有請求。 當我想到爲會話數據使用mongodb或redis時,我不知道如何在會話結束時清除會話數據。似乎沒有任何裝飾器可以運行會話拆卸,以便redis/mongodb在不再需要時可以清除會話數據。 – Roshmaster

+0

你永遠不知道會話何時結束 - 你不知道用戶在瀏覽器中的請求之間做了什麼。如果您的應用有意義,您可以在「註銷」功能中清空會話。可能更相關,你可以在redis中的數據上設置一個簡短的ETL,並讓數據庫爲你處理清理。 –

+0

對,我知道我不知道會議何時結束。爲了解決這個問題,我將會話生存期設置爲5分鐘,並且每當用戶執行請求時都會刷新該時間。所以實際上,我知道會話將在最後一次請求後5分鐘結束。我很好奇在會話超時時是否有辦法處理拆解? 當你說ETL時,你的意思是提取/轉換/加載或其他機制,我不知道這是特定於這些數據庫? – Roshmaster