python-django框架-電商項目-首頁開發
業務背景:
- 用戶瀏覽網站一定是先到首頁,
- 沒有登陸的話首頁內容完全一樣,而且是不經常變化的,
- 一段時間內,有100用戶訪問,就要有幾個用戶就要查詢多少次數據庫,
- 查出來的數據都是一樣的,
- 怎么辦?
- 我們把頁面生成一個靜態頁面,
- 用戶訪問的時候,我給用戶返回一個靜態的頁面,
- 可以使用我們之前講到的celery,定義一個任務函數,生成一個靜態頁面,
- 什么時候首頁的靜態頁面需要重新生成?
- 頁面改動的時候就需要重新生成,
- 當管理員在后台修改了首頁的信息,對應的表格中的數據的時候,需要重新生成我們的首頁靜態文件,
給celery定義個任務函數:
- generate_static_index_html函數
- 在虛擬機啟動worker,
- 把項目代碼復制到虛擬機中,可以放到桌面
- 進入項目路徑,/home/andy/桌面/dailyfresh/,一定要在這個項目目錄下面!!
- 進入虛擬機工作空間,workon lq_py3
- 啟動這個任務,celery -A celery_tasks.tasks worker -l info
- 報錯了,應該是有服務沒有啟動,借這個機會,我重新梳理一下celery,重新開一個博客,
- 啟動成功了,繼續,
發出celery任務
- 在django的console,
- 輸入from celery_tasks.tasks import generate_static_index_html
- generate_static_index_html.delay()
- 現在這個頁面已經生成了,但是這個文件是在Ubuntu生成的,那我們怎么訪問這個頁面?
配置Nginx提交靜態頁面,
- 我們啟動了一個celery的task
- 我們只要一發送django的這個任務,就會生成靜態頁面,
- 但是這個頁面是生成在celery這邊的,
- 怎么訪問?
- Nginx之前可以提供圖片,同樣的,用戶可以直接訪問Nginx,Nginx也可以返回靜態頁面,
- 所以用戶只要訪問瀏覽器,直接訪問Nginx就可以返回對應的頁面了,
- 需要配置一下,
- 打開配置文件,在usr/local/nginx
- 配置文件可以再加一個server,一個server就是一個Nginx服務器,
- 加兩個地方的配置項,
- 重啟Nginx,
- sudo sbin/nginx -s reload
- nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
- 解決方法:
- [root@localhost nginx]# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- 這個時候實際啟動了兩個server,一個8888,一個80,
- 這個時候在虛擬機中輸入http://127.0.0.1/,默認訪問80端口,就可以看到我們的首頁了,
- 在外部訪問也是一樣的,http://192.168.100.128/
更新首頁內容時,重新生成靜態頁面,
- 后台admin修改了首頁的內容,就需要再次生成靜態頁面,
- 如何操作?
- 每一個后台管理頁面,都可以定義一個模型管理類,繼承modeladmin,
- 這里面有兩個方法, 一個savemodel,一個deletemodel,
- 后台管理員更新數據的時候,就會執行savemodel,如果刪除數據就是deletemodel,
- 我們需要在這兩個方法中加附加的操作,修改的時候重新生成靜態頁面
- 我們不能改他的源代碼,我們可以重寫這個方法,
- 生成靜態頁面的代碼,我們采用異步,就是因為生成的代碼需要時間,如果生成比較就頁面就會比較卡,
靜態頁面和indexview的調度說明:
- 我們訪問靜態頁面,是訪問的Nginx,但是django和Nginx可能不在一台電腦上,
- 怎么讓用戶直接訪問靜態頁面,
- 部署的時候,
- django網站,celery服務器,這可能在不同的電腦,
- django服務器上是indexviews,
- celery服務器上是一個靜態頁面,
- 搭建一個Nginx,用來調度,Nginx有自己的ip,瀏覽器用戶訪問整個網站的時候,我只暴露Nginx的ip,我只會告訴客戶Nginx的服務器,先去請求Nginx,然后Nginx決定是要返回靜態頁面,還是調用django的視圖,
- 怎么區分,需要對兩個地址做設計,直接訪問Nginx地址的ip的時候,直接把靜態的頁面找到,如果是訪問的是一個ip后面還有地址,比如一個index,就要交給django服務器,這就是區分的方法,
- http://192.168.100.128/,訪問celery服務器的靜態頁面,
- http://192.168.100.128/index,訪問django服務器的indexviews視圖,
- 所以我們隊indexviews的對對應的地址做一個修改,加上index,
- 還有好幾個頁面沒有寫,后面需要自己寫的,
頁數數據的緩存:
- 什么是頁面數據的緩存?
- 看首頁,很多內容無論有沒有登陸都是一樣的,
- 有區別的地方是登陸之后有一部分不一樣,
- 這樣很多人訪問首頁,就要反復查數據庫,所以可以把頁面存放在緩存中,當再次使用這些數據時,先從緩存中獲取,如果獲取不到,再去查詢數據庫, 減少數據庫查詢的次數
- django中的緩存相關的知識:
- django提供了緩存的功能,使用緩存的目的就是可以方便拿,通過配置setting中的cash可以配置緩存,
- 有幾種級別,
- 站點級別的緩存,這個是整個網站都緩存,這個占用的空間太大了,不合適,
- 單個view的緩存,django提供了一個方法,cash_page,這是一個裝飾器,這種第一次訪問視圖的時候緩存起來,然后下一次從緩存中取,這種不合適,為什么?因為每一個用戶的數據是不一樣的,所以不能使用單個view的緩存,
- 模板片段的緩存,load_cache,這種業不合適,因為使用模板的時候最后使用模板, 但是前面都查完了所以不合適,
- 所以都不合適,
- 所以我們需要操作底層的緩存api,自己設計,
- 怎么設計?
- 我們緩存的時候只需要緩存一部分數據,拿到數據之后就可以設置緩存了,
- 用法:
- from django.core.cache import cache
- cache.set(key,value,過期時間timeout),這個timeout可選,不選就是永久,所以要設置,
- 設置成功了,從redis客戶端可以查看到,
- context = cache.get('index_page_data')
什么時候更新緩存的數據?
- 管理員修改了首頁的數據的時候,需要更改緩存的數據,
- 還是在admin里面,把之前緩存的數據清除,下一次就會再次生成這個數據的緩存,就相當於更新了,
- cache.delete('index_page_data')
- 為什么緩存要設置過期的時間?
- 數據改了還是會顯示緩存的內容,所以要設置過期時間,防止一直都是查的緩存,
總結一下頁面的靜態化和緩存的設置:
- 其實不影響網站的功能,是對網站性能的優化,
- 你進行網站優化,一個關鍵點,就是減少數據庫查詢的次數,
- 面試問道就是頁面的靜態化,和數據的緩存,
- 還可以防止惡意的攻擊,黑客同時對你的服務器發起訪問,如果你沒有使用頁面靜態化,你就要每次都要查,數量太大了,你的網站是處理不了的,會導致網站崩潰,
首頁內容的獲取和展示:
- 獲取商品的種類信息,
- 獲取首頁的輪播商品信息,
- 獲取促銷活動信息,
- 獲取首頁分類商品展示信息,
- 獲取用戶購物車商品數量,
redis存儲購物車記錄分析:
- 1,什么時候添加購物車記錄?
- 用戶點擊添加到購物車的時候添加,
- 在商品詳情頁面點擊加入購物車,還有在商品列表頁點擊加入購物車,
- 兩個地方都可以加入購物車,我們需要添加購物車記錄,,
- 2,什么時候需要獲取購物車記錄,
- 頁面的頂部需要,和購物車頁面需要獲取,
- 3,使用什么存儲購物車記錄,
- 這個和瀏覽記錄一樣,瀏覽比較快,添加購物車也是比較快,存在表里面會不停的訪問數據庫,所以我們使用redis存儲購物車記錄,
- 4,分析存儲購物車記錄的格式
- 一個用戶的記錄使用一條記錄保存,
- 我應該保存什么內容,添加數量,skuid,用戶id,我不需要把商品的價格名稱都記下來,
- 我們使用什么格式保存?
- 上一次保存瀏覽記錄使用的list,
- 分析:
- 使用列表:
- cart_用戶id[“1,5”“2,3”]這是商品1,加了5件,商品2加了3件,可以做到,但是用戶再次加了商品2兩個,還需要操作這條數據,
- 使用hash,
- cart_用戶id:{sku_id1:商品數目,sku_id2:商品數目},所以使用hash比較方便,
- 例子:
- cart_1:{1 : 2, 2 : 3 }
- HLEN這個命令,把購物車商品的條數,就知道了購物車的數量了,
獲取購物車的數目:
- 判斷登陸,
- 然后連接redis,開始取值,
- 模式取數據,在redis插入數據,然后看是否取值正確了,