天天生鲜的用户登录机制和redis的作用
登錄機制:
采用的是user.is_authenticated的校驗.
采用了django的auth系統,
登陸使用了django.contrib.auth中的login方法,
該方法會為將user_id以及user_backend放入session中存儲,
.is_authenticated()通過判斷session中是否有user_id 以及user_backend 來判斷用戶是否登陸。
我自己看了下工程文件,沒有看到session字樣的變量,應該是被封裝在源碼中了.
---------------------------------------------------
redis在這個項目中的用處有兩處:
一處被用在celery中,作為broker,這個很簡單,
就是異步郵件隊列.
還有一處被用在cart/views.py中,我們以cart.html為例:
該頁面對應的類視圖是cart/views.py中的CartInfoView:
class CartInfoView(LoginRequiredMixin, View):print("-----------------------購物車頁面顯示--------------------")def get(self, request):user = request.user# 獲取用戶購物車中商品的信息conn = get_redis_connection('default')cart_key = 'cart_%d' % user.idprint("cart_key=",cart_key)# cart_1# {'商品id':商品數量}cart_dict = conn.hgetall(cart_key)skus = []# 保存用戶購物從中商品的總數和總價total_count = 0total_price = 0# 遍歷獲取商品的信息for sku_id, count in cart_dict.items():# print("------------看下for環迅里面的情況--------")sku_id=int(sku_id)count=int(count)# print("sku_id=",sku_id)# print("count=",count)# print("????????")# 根據商品的id獲取商品的信息sku = GoodsSKU.objects.get(id=sku_id)# 計算商品的小計amount = sku.price * int(count)# 動態給sku對象增加一個屬性amount,保存商品的小計sku.amount = amount# 動態給sku對象增加一個屬性count,保存購物車中對應商品的數量# print("看下這里的情況")# print("count=",count)# print("type(count)=",type(count))sku.count = count# print("sku.count=",sku.count)# print("type(sku.count)=",type(sku.count))# 添加skus.append(sku)# 累加計算商品的總數和總價total_count += int(count)total_price += amount# 組織上下文context = {'total_count': total_count,'total_price': total_price,'skus': skus}return render(request, 'cart.html', context)這里的redis啥作用呢?
很簡單,你在頁面下單前,肯定東逛西逛,逛吃逛吃,
難道你選中一個商品就往后端數據庫里面寫一次嗎?
那服務器壓力也太大了,
我們需要一個臨時的數據庫,這個臨時的數據庫就是redis,當我們最終選定多個商品,想要全部買下之前,
購物車的數據都保存在redis中,用user.id來防止不同用戶之間的購物車數據混淆.
?
-------------------------------------代碼細節簡要分析-----------------------------------------------------------------
從redis中獲取之前扔在購物車里面的東西:
cart_dict = conn.hgetall(cart_key)這時,如果用戶手動填寫增加購物車商品數量,那么把該數量寫入redis:
通過cart.html中的update_remote_cart_info發送請求給后端app/cart/views.py中的CartUpdateView,
再次連接redis來更新購物車中的每個商品的訂購數量
# 業務處理:更新購物車記錄conn = get_redis_connection('default')cart_key = 'cart_%d' % user.id# 校驗商品的庫存if count > sku.stock:return JsonResponse({'res': 4, 'errmsg': '商品庫存不足'})# 更新conn.hset(cart_key, sku_id, count)---------------------------下面的分析和上面的視圖函數無關---------------------------------------------------------------------------
當我們逛完網站需要真正下單的時候
redis里面的數據全部寫入后端數據庫,同時redis清空.
所以,redis常常被稱為數據庫,但是又常常被稱為緩存,就是這個道理了.
--------------------------------------------------------------------------------------------------------------------------
剛才上廁所的時候在想instagram的用完即焚功能,
突然有了靈感:
instagram肯定也是用的這種類似的臨時數據庫.
圖片傳到服務器,圖皮保存鏈接到redis,
用戶看完就銷毀redis里面的數據.
?
Reference:
[1]一個簡單的django user.is_authenticated問題
總結
以上是生活随笔為你收集整理的天天生鲜的用户登录机制和redis的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: @property和@setter和@g
- 下一篇: Kaggle竞赛方案分享:如何分辨杂草和