日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python美多商城项目百度网盘_美多商城项目(七)

發布時間:2024/8/5 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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美多商城项目百度网盘_美多商城项目(七)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。