2015-04-30 37 views
5

我的應用程序實現了一個購物車,匿名用戶可以在其中使用產品填充購物車。用戶登錄只在付款之前需要。這如何實現?如何使用Flask跟蹤匿名用戶

主要挑戰是燒瓶必須跟蹤用戶(即使匿名)和他們的訂單。我目前的做法是利用分配給current_userAnonymousUserMixin對象。假設current_user在整個會話中不會改變。不過,我注意到一個新的AnonymousUserMixin對象被分配給current_user,例如,每刷新一次瀏覽器頁面。請注意,如果用戶通過身份驗證,則不會發生這種情況。

關於如何規避這個問題的任何建議?

回答

8

無需自定義AnonymousUserMixin,你可以保持在會話中的購物車數據:

  • 匿名用戶添加的東西HIST車 - >與車數據
  • 用戶更新自己的會話想要結賬 - >將他重定向到登錄頁面
  • 登錄用戶返回結賬 - >將他的購物車數據帶出會話並做任何你會做的事情,如果他一直登錄
1

如果您願意,您可以使用AnonymousUserMixin子類,但您需要添加一些邏輯,以便您可以將每個匿名用戶與存儲在數據庫中的購物車相關聯。

這是你可以做什麼:

  1. 當一個新的用戶連接到您的應用程序分配一個隨機生成的唯一的ID。您可以將此隨機ID寫入用戶會話(如果您希望在用戶關閉瀏覽器窗口時刪除購物車)或長時間存儲的Cookie(如果您希望即使在關閉瀏覽器後也能記住購物車)。實際上,您可以使用Flask-Login來管理會話/ cookie,您不必將未知用戶視爲匿名用戶,只要您爲他們分配了一個ID,就可以將他們視爲登錄用戶。

  2. 你怎麼知道匿名用戶是已知的還是新的?當用戶連接時,檢查會話或cookie是否存在,並在那裏查找id。如果找到了某個ID,則可以爲該用戶找到該購物車。如果您使用AnonymousUserMixin的子類,則可以將該ID添加爲成員變量,以便即使對於匿名用戶也可以執行current_user.id。您可以在Flask-Login用戶加載程序回調中使用此邏輯。

  3. 當用戶準備付款時,您將匿名用戶轉換爲註冊用戶,並保留該ID。

  4. 如果您有一個定期清理數據庫中舊/匿名購物車的cron作業,您可能會發現一箇舊的匿名用戶連接並提供了一個在數據庫中沒有購物車的用戶標識(因爲購物車被視爲陳舊並被刪除)。您可以通過爲同一個ID創建一個全新的購物車來處理此問題,甚至可以通知用戶購物車的內容已過期並已被刪除。

希望這有助於!

+0

謝謝!有沒有辦法保護我的應用程序免受惡意用戶的侵害?有人可能通過以下方式進行攻擊:(i)創建購物車,以及(ii)在循環中關閉會話(或刪除cookie)。有沒有辦法讓cron作業(或任務隊列)幫助避免數據庫大小不受控制地增加?每次購物車創建時檢查數據庫的大小是我想避免的。 – LuisO

+0

沒有什麼萬無一失的東西,但你可以跟蹤用戶的IP地址,並確保你不允許多個購物車同一個。或者,您可以將創建日期寫入所有購物車,並且當您需要創建新購物車時,請運行查詢以查明您在過去N分鐘內創建了多少個購物車。如果您發現這是一個很大的數字,您可以停止創建新的購物車。 – Miguel