python美多商城项目百度网盘_美多商城项目(七)
正文共: 7620字 4圖
預計閱讀時間: 20分鐘
每日分享
If you can change your mind, you can change your life.
如果你愿意改變你的想法,你可以改變你的人生。
小閆語錄:
有時候失敗并不是你不夠努力,而是你對自己的盲目自信,以及那份固執。堅持該堅持的,改變該改變的,放棄該放棄的,前面將是柳暗花明。有些人明知道自己是錯的,但是那可憐的自尊心讓其不愿承認其他人的正確,那份小傲嬌會讓你付出巨大的代價。還有些人是因為缺少從頭再來的勇氣,寧愿一錯再錯,其實從頭再來并沒有那么難,難的是做出這個決定。
美多商城項目(七)
項目倉庫https://github.com/EthanYan6/E-commerce-sites.git結合代碼查看筆記,效果更佳。筆記只是記錄重點或者難點。
1.登錄用戶瀏覽商品記錄Django開發web項目中,如果是前后端分離的模式,那么基本都是使用rest_framework框架。如果是前后端不分離,就不會使用了。tornado學習難度會大一點。
1.什么時候需要獲取登錄用戶瀏覽商品的記錄? 何時取?
答:當登錄用戶進入個人信息頁面時,需要獲取登錄用戶瀏覽商品的記錄。
2.什么時候需要保存登錄用戶瀏覽商品的記錄? 何時存?
答:當登錄用戶瀏覽某個商品的詳情頁面時,需要保存登錄用戶瀏覽商品的記錄。
3.瀏覽記錄保存在哪里? 存在哪?
答:如果將瀏覽記錄保存在MySQL數據庫的表中,用戶頻繁的瀏覽商品,就需要頻繁的操作MySQL數據庫,相應性能有所下降。
iduser_idsku_id123表格中的信息代表id為2的用戶瀏覽了id為3的商品
將用戶瀏覽記錄存儲在redis中。
4.在redis中怎么存儲登錄用戶瀏覽記錄? 怎么存?
答:采用列表的數據類型存儲。list: history_: [,...]
redis存儲分為五種數據類型。以key-value形式存儲。# 1.string: 字符串
history_: '3,5,1'
#上述方法存儲后,取值時,可以按`,`進行分割。
例如:
user_2: '1,5'
user_3: '3,5'
# 2.hash: 哈希 key: {field:value, field: value}
history: {
:'3,5,1',
:'1,2',
...
}
# 3.list: 列表 key: [value, ...]
history_: [3, 5, 1]
# 4.set: 無序集合
不能使用,因為用戶瀏覽記錄是有序的。
# 5.zset: 有序集合
需要額外加權重值,然后按權重值進行排序。字符串和hash存儲的時候需要額外的字符串操作,而列表直接可以存儲,然后直接取值。zset需要額外的權重值來保證有序,而列表不需要。
1.1瀏覽記錄保存API: POST /browse_histories/
參數:
通過請求頭傳遞jwt token
{
"sku_id": "商品id"
}
響應:
{
"sku_id": "商品id"
}
在redis中存儲瀏覽記錄的過程:history_2: ['1','3','5']
# 如果id為2的用戶又瀏覽了id為4的商品,將記錄保存在列表左側
history_2: ['4','1','3','5']
# 如果id為2的用戶又瀏覽了id為3的商品,我們需要去重
在redis中存儲瀏覽記錄的過程:
# 去重:如果商品已經被瀏覽,需要將商品id先從列表中移除。
# 保持有序:最新瀏覽商品的id添加到list列表最左側。
# 截取:只保留最新幾個瀏覽商品id
lremlrem
從redis列表中移除元素,有則刪除,無則忽略,不會報錯。my_list:[1,3,2,3,5,3,6]
# 要刪除所有的3
lrem my_list 0 3
# 從左往右將3刪除2次
lrem my_list 2 3
# 從右往左將3刪除2次
lrem my_list -2 3
lpushlpush ...
向redis列表左側加入元素。
ltrimltrim
保留redis列表指定區間內元素。
業務邏輯
1.獲取skuid并進行校驗(skuid必傳,sku_id商品是否存在)。定義序列化器類來實現校驗。
2.在redis中存儲登錄用戶瀏覽的記錄。(create)在序列化器類中定義create方法a.獲取redis鏈接對象 StrictRedis
b.拼接key
c.去重:如果商品已經被瀏覽,需要將商品id先從列表中移除。
d.保持有序:最新瀏覽的商品的id添加到list列表最左側。
e.截取:只保留最新幾個瀏覽商品id。
3.返回應答,瀏覽記錄添加成功。如果create中返回的是validated_data,那么接口中的serializer.data返回的就是一個對象。
如果create中返回的是一個字典,那么接口中的serializer.data返回的就是一個字典。
在redis中進行查看:
a.打開redis客戶端redis-cli
b.選擇4號庫select 4
c.查看里面的所有記錄keys *
1.2瀏覽記錄獲取API: GET /browse_historise/
參數:
通過請求頭傳遞jwt token
響應:
[
{
"id": "商品id",
"name": "商品名稱",
"price": "商品價格",
"default_image_url": "默認圖片",
"comments": "評論量"
},
...
]
lrangelrange
返回一個列表,包含指定區間內的元素。超出范圍的下標取值不會引起錯誤。閉區間
目的:獲取redis列表指定區間內的元素。
業務邏輯
1.獲取redis鏈接對象 StrictRedis
2.拼接key
3.從redis中獲取登錄用戶瀏覽的商品sku_id。
4.根據商品sku_id獲取對應商品數據。
5.將商品的數據序列化并返回響應。
2.獲取分類SKU商品的數據
根據第三級分類ID獲取分類SKU商品的數據。
a.支持分頁功能。
b.支持排序功能。API:
GET /categories/(?P\d+)/skus/?page=<頁碼>&page_size=<頁容量>&ordering=<排序字段>
參數:
通過url傳遞第三極分類ID
響應:
[
"count": "總數量",
"next": "下一頁鏈接地址",
"previous": "上一頁鏈接地址",
"results": [
{
"id": "商品id",
"name": "商品名稱",
"price": "商品價格",
"default_image_url": "默認圖片",
"comments": "評論量"
},
...
]
]
業務邏輯
1.根據 category_id獲取分類SKU商品的數據。
2.將商品的數據序列化并返回。self.kwargs:是一個字典dict,保存的是從url地址中提取的所有命名參數。
總結
1.瀏覽記錄
瀏覽記錄存儲:(何時存、何時取、存在哪、怎么存)
瀏覽記錄添加:去重lrem、左側加入lpush、截取ltrim
瀏覽記錄獲取:lrange
2.分類SKU商品數據
根據第三級分類id獲取sku商品的數據
支持分頁
支持排序
3.商品搜索
3.1需求
根據商品的名稱和副標題搜索商品的數據。
舉例:
關鍵字:iPhone
sql語句:select * from tb_sku where name like '%iPhone%' or caption like '%iPhone%';
在SQL語句查詢中,like語句查詢效率很低,在搜索的時候不會使用SQL,而是使用搜索引擎。
3.2搜索引擎
3.2.1.搜索引擎概念&原理
3.2.2.搜索引擎功能
3.2.3.搜索引擎環境搭建
3.2.4.Django對接搜索引擎
3.2.1概念
可以對數據表中的數據進行處理,建立索引結構數據( 記錄索引記錄和數據庫中真實數據之間對應關系),在搜索引擎建立索引結構數據時,還會對 索引字段進行關鍵詞拆分,然后保存每個關鍵字在哪些索引記錄中存在。
索引字段:根據哪些表字段來搜索數據,這些字段就是索引字段。
idnamecaption......1Apple iPhone 8 Plus (A1864) 256GB 深空灰色 移動聯通電信4G手機選【移動優惠購】新機配新卡,198優質靚號,流量不限量!
2Apple iPhone 8 Plus (A1864) 256GB 金色 移動聯通電信4G手機選【移動優惠購】新機配新卡,198優質靚號,流量不限量!
AppleiPhone8Plus(A1864)256GB深空灰色移動聯通電信4G手機\n選【移動優惠購】新機配新卡,198優質靚號,流量不限量!
搜索引擎作用:針對索引字段的內容進行關鍵詞的分詞并建立對應的索引數據。slor/whoosh/es/....搜索引擎有很多,我們選擇es(Elasticsearch)。es是開源的,目前全文搜索引擎的首選。是Java實現的。
3.2.2搜索引擎功能
1.建立索引結構的數據。
2.根據關鍵字檢索對應的索引的記錄。注意:拿到索引記錄之后,對應數據庫中真實的數據,需要自己進行查詢,搜索引擎不會去做。
3.3.3環境搭建
獲取鏡像,可以通過網絡pulldocker image pull delron/elasticsearch-ik:2.4.6-1.0
或者加載其他人提供的鏡像文件docker load -i elasticsearch-ik-2.4.6_docker.tar
修改elasticsearch的配置文件 elasticsearc-2.4.6/config/elasticsearch.yml第54行,更改ip地址為本機ip地址network.host: 10.211.55.5
創建docker容器運行,注意將elasticsearc-2.4.6目錄放置到home目錄:docker run -dti --network=host --name=elasticsearch -v /home/python/elasticsearch-2.4.6/config:/usr/share/elasticsearch/config delron/elasticsearch-ik:2.4.6-1.0
檢查是否啟動成功:
瀏覽器放問下面的地址,如果返回了內容,那么搜索引擎啟動成功。<自己電腦IP>:9200es默認端口是9200
3.3.4Django對應es搜索引擎
作為開發者,如果自己寫代碼對接搜索引擎,需要了解很多搜索引擎內部原理操作。
全文檢索框架:幫助開發者使用搜索引擎的功能。
Python中使用haystack框架,它支持多種搜索引擎,幫助開發者使用搜索引擎的功能。
全文檢索框架功能:
1.幫助開發者利用搜索引擎建立索引結構數據。
2.幫助開發者利用搜索引擎根據關鍵字來檢索索引記錄。
3.幫助開發者根據索引記錄到數據庫中查詢真實的數據。
通過使用haystack來調用Elasticsearch搜索引擎:
1.安裝:pip install drf-haystack
pip install elasticsearch==2.4.1drf-haystack是為了在REST framework中使用haystack而進行的封裝(如果在Django中使用haystack,則安裝django-haystack即可)
2.注冊應用INSTALLED_APPS = [
...
'haystack',
...
]
3.配置:在配置文件中配置haystack使用的搜索引擎后端# Haystack全文檢索框架配置
HAYSTACK_CONNECTIONS = {
'default': {
# 指定所使用的搜索引擎
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
# 指定es搜索引擎服務器地址
'URL': 'http://192.168.59.225:9200//', # 此處為elasticsearch運行的服務器ip地址,端口號固定為9200
# 指定elasticsearch建立的索引庫的名稱
'INDEX_NAME': 'meiduo', # 指定elasticsearch建立的索引庫的名稱
},
}
# 當添加、修改、刪除數據時,自動生成索引
HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor'HAYSTACKSIGNALPROCESSOR 的配置保證了在Django運行起來后,有新的數據產生時,haystack仍然可以讓Elasticsearch實時生成新數據的索引
haystack對接es搜索引擎
1.建立索引結構數據。
1.1建立索引類
在子應用下新建文件search_indexes.py文件名是固定的
在template下面建立目錄search,在search目錄下建立目錄indexes,在indexes目錄下建立目錄<子應用名>,在這個目錄下建立文件,文件名如下:文件名格式:<模型類名小寫>_text.txt所有的名稱都是固定不變的。
1.2指定索引字段
1.3執行命令,建立索引數據:python manage.py rebulid_inex
2.編寫搜索API接口。API: GET /skus/search/?text=<搜索關鍵字>
參數:
通過text查詢字符串傳遞<搜索關鍵字>
響應:
...
代碼:# GET /skus/search/?text=<搜索關鍵字>
class SKUSearchViewSet(HaystackViewSet):
# 指定索引類對應模型類
index_models = [SKU]
# 指定搜索結果序列化時所使用的序列化器類
# 搜索結果中每個對象都包含兩個屬性:
# text:索引字段的內容
# object:從數據庫中搜索出模型對象
serializer_class = SKUIndexSerializer
4.購物車記錄存儲
需求:登錄用戶和未登錄用戶都能進行購物車記錄添加。
4.1存儲方案
4.1.1登錄用戶的購物車記錄存儲
1.存在哪?redis
答:存在redis中。因為如果存儲在mysql中,用戶頻繁的操作購物車的記錄(刪除或這添加),就需要頻繁操作mysql數據庫。在redis中存儲登錄用戶的購物車記錄。讀寫效率要快很多。
如果采用MySQL數據庫,需要設計如下表格:
iduser_idsku_idcountselect(勾選狀態)12131
2.怎么存?
答:每個登錄用戶的購物車記錄采用redis中兩條數據來存:
hash:存儲登錄用戶購物車中添加的商品id和對應數量。
set:存儲登錄用戶購物車中被勾選的商品id。# hash: 哈希 : {: , ...}
cart_: {
: ,
: ,
...
}
# set:集合
cart_selected_: ('','', ...)
例如:
cart_2: {
'1':'3',
'3':'2',
'5':'1'
}
id為2用戶購物車記錄:
id為1的商品添加了3件;
id為3的商品添加了2件;
id為5的商品添加了1件;
cart_selected_2: ('1','5')
id為1和5的商品對應的購物車記錄是被勾選的。
4.1.2未登錄用戶購物車記錄存儲
1.存在哪?客戶端cookie中
答:未登錄用戶可能根本不是網站注冊用戶,只訪問一次就永不訪問,如果將購物車記錄存儲到服務器,可能會造成服務器存儲空間浪費,所以可以直接未將登錄用戶購物車記錄存儲到客戶端。
cookie/sessionSrotage/LocalStorage三種存儲方式,我們選擇存儲到cookie中。
2.怎么存?
答:'cart': {
: {
'count': '',
'selected': ''
},
: {
'count': '',
'selected': ''
},
...
}
例如:
'cart': {
1: {
'count':2,
'selected': False
},
5: {
'count':1,
'selected': True
},
3: {
'count': 5,
'selected': False
}
}
未登錄用戶購物車包含id為1,3和5的商品。
id為1的商品添加了2件;
id為5的商品添加了1件;
id為3的商品添加了5件;
id為5的商品是被選中的。
3.Django中cookie設置和獲取
答:# 1.設置cookie
response.set_cookie('','',max_age='<有效時間:s>')
# 2.獲取cookie
request.COOKIES.get('')
# json模塊
json.dumps(dict):將字典轉換為json字符串
json.loads(json字符串):將json字符串轉化為字典
# pickle模塊-python標準模塊
pickle.dumps(dict|對象):將傳入的數據轉換為bytes字節流
pickle.loads(bytes字節流):將bytes字節流轉換為dict|對象
# base64模塊
base64.b64encode(bytes字節流):將傳入的bytes字節流進行base64編碼,返回編碼之后的bytes內容。
base64.b64decode(編碼之后的bytes字節流|str):將傳入的內容進行base64解碼,返回解碼之后的內容。
# 設置cookie中購物車數據:
cart_data = bae64.b64encode(pickle.dumps(cart_dict)).decode()
response.set_cookie('cart',cart_data,max_age='過期時間:s')
# cookie中購物車數據解析
cookie_cart = request.COOKIES.get('cart')
cart_dict = pickle.loads(base64.b64decode(cookie_cart.encode()))
或者cart_dict = pickle.loads(base64.b64decode(cookie_cart))
優質文章推薦:
總結
以上是生活随笔為你收集整理的python美多商城项目百度网盘_美多商城项目(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS4的手柄可以连接电脑么ps4手柄能连
- 下一篇: 魔卡战姬最强阵容搭配攻略 魔卡战姬阵容怎