1. 程式人生 > >電商網站(Django框架)—— 大綱內容與基本功能分析

電商網站(Django框架)—— 大綱內容與基本功能分析

1.  專案架構

2.  資料庫表結構


3.  資料庫讀寫分離

 

4.  Django讀寫分離配置

新建utils/db_router.py

 

課後閱讀資料

5.  使用者認證模型

注意: AUTH_USER_MODEL配置引數要在第一次遷移資料庫之前配置,否則可能django的認證系統工作不正常

6. 類檢視

將檢視view以類的形式定義

通用類檢視基類:

django.views.generic.View  ( 與django.views.generic.base.View 是同一個)

urls.py中配置路由使用類檢視的as_view()方法

由dispatch()方法具體將請求request分發至對應請求方式的處理方法中(get、post等)

擴充套件閱讀:

7. 使用者模組開發

7.1 Django認證系統文件

7.2 使用者註冊

註冊: 儲存資料庫-> 生成token  -> 傳送郵件

(使用者點選郵件中的連結地址---啟用的地址)

啟用:獲取token設定使用者的啟用狀態

把使用者的id放到token中  簽名

安裝itsdangerous:      pip install itsdangerous

安裝celery:   pipinstall celery

 

7.3 使用者啟用

7.4 使用者登入

使用redis作為session伺服器

安裝命令:pip install django-redis

django-redis文件:

django的session使用文件:

登入-> 儲存使用者的session資料

只要瀏覽器中cookie能夠在訪問的時候帶上session_id,

        使用者訪問其他頁面,不需要再次登入

如果cookie中沒有session_id,訪問的時候後端無法識別使用者,要求使用者從新登入

7.5 使用者退出

7.6 使用者地址

7.7 使用者個人資訊

瀏覽歷史記錄:

產生:  使用者訪問商品詳情頁面的時候記錄  次數頻繁,所以放到記憶體型資料庫中  儲存sku_id

不放到session資料中,方便使用者退出再登陸的時候還能檢視到資料

手動直接操作redis,存放歷史記錄資訊

查詢: 只在使用者的個人資訊頁面中看到

“key”: 字串、列表、雜湊、set  zset

用一條記錄儲存所有人的資訊, 維護起來不方便,不採納

“history”: {“user_1”:“1,2,3,4,5,6”  , “user_2”:  “”}

conn.hget(“history”, “user_1”)

每個使用者一條資料,單獨維護

“history_1”:  [1,2,2,3,4,4]

conn.lrange(“history_1”,0, 4)

7.7.1  django查詢集queryset使用方法

8  Address.objects.all().order_by("-create_time")
Address.objects.filter().order_by(
"-create_time")

select *
from tbl_addrwhere .... order by create_time desc

Address.objects.filter().order_by("-create_time")

select * from tbl where ....  order by create_time desc

Address.objects.all().order_by(“-create_time”)[0]

  Address.objects.latest(“-create_time”)

關於Django查詢方法的文件:

7.7.2 使用redis儲存使用者的瀏覽歷史

通過django_redis 的 get_redis_connection(連線名稱) 在程式中使用redis

7.7.3 redis中的使用者瀏覽歷史資料型別選擇

瀏覽歷史記錄redis

字串  列表  雜湊  set

sku_id 

“user_1_history”:“1,2,3,4,5”

 

8.  商品模組開發

8.1    瞭解FastDFS分散式檔案系統

叢集

 

啟動FastDFS的方法,需要的操作:

1.修改如下的配置檔案  (在/etc/fdfs目錄中)

tracker_server=自己的ip地址:22122

2.啟動tracker、storage、nginx服務:

sudo servicefdfs_trackerd start

sudo servicefdfs_storaged start

sudo /usr/local/nginx/sbin/nginx

3. 執行如下命令測試是否成功

fdfs_upload_file /etc/fdfs/client.conf 要上傳的圖片檔案

如果返回類似group1/M00/00/00/rBIK6VcaP0aARXXvAAHrUgHEviQ394.jpg的檔案id則說明檔案上傳成功

在瀏覽器中可以用   127.0.0.1:8888/返回的檔案id  

訪問圖片

python對接fastdfs

1. workon django_py3

2. 進入fdfs_client-py-master.zip所在目錄

3. pip install fdfs_client-py-master.zip

>>> fromfdfs_client.client import Fdfs_client

>>> client =Fdfs_client('/etc/fdfs/client.conf')

>>> ret =client.upload_by_filename('test')

>>> ret

{'Group name':'group1','Status':'Uploadsuccessed.', 'Remote file_id':'group1/M00/00/00/

        wKjzh0_xaR63RExnAAAaDqbNk5E1398.py','Uploadedsize':'6.0KB','Local file name':'test'

        , 'Storage IP':'192.168.243.133'}

8.2 Django二次開發對接FastDFS

Django文件:

 

建立utils/fastdfs 目錄

 

在goods/admin.py中註冊商品相關模型,然後登陸admin站點進行測試

 

8.3 富文字編輯器

為Goods模型新增詳細資訊欄位

8.4 商品首頁

8.4.1 基本頁面處理

8.4.2 儲存購物車資訊的資料設計

儲存在redis中,每個人維護一條購物車資料, 選擇雜湊型別

“cart_使用者id”:{ “sku_1”:“10”,  ” sku_2”: “11”}

hlen()


8.4.3 頁面靜態化

把原本動態的頁面處理結果儲存成html檔案,讓使用者直接訪問這個生成出來的靜態的html頁面

 

 


8.4.4 使用快取

將處理計算的結果先臨時儲存起來,下次使用的時候可以先直接使用,如果沒有這個備份的資料,重新進行計算處理

將快取資料儲存在內容中(本專案中儲存在redis中)

cache

pickle  dumps loads

修改了資料庫的資料,直接刪除快取

快取要設定有效期

django文件:

8.5 商品詳情頁

RESTFul

8.6 商品列表頁

分頁

 

 

8.7 搜尋頁面

草莓  GoodsSKU   df_sku

select* from df_sku where name like ‘%草莓%’ or title like ‘%草莓%’

草莓 500g    盒裝草莓    大草莓

北京草莓

搜尋引擎 

1.      建立資料的索引表    草莓 sku= 1 2 3  基圍蝦 sku =100

2.      進行分詞操作

whoosh 

搜尋框架

haystack  搭建了使用者和搜尋引擎之間的溝通問題

配置:

1)     安裝python包。

pip install django-haystack

pip install whoosh

2)     在settings.py檔案中註冊應用haystack並做如下配置。


3)在goods應用目錄下新建一個search_indexes.py檔案,在其中定義一個商品索引類e。


4)在templates下面新建目錄search/indexes/goods


在此目錄下面新建一個檔案goodssku_text.txt並編輯內容如下:


5)使用命令生成索引檔案。

         pythonmanage.py rebuild_index

全文檢索的使用:

1)配置url。


2)表單搜尋時設定表單內容如下。


點選標題進行提交時,會通過haystack搜尋資料。

全文檢索結果:

搜尋出結果後,haystack會把搜尋出的結果傳遞給templates/search目錄下的search.html,傳遞的上下文包括:

l  query:搜尋關

l  page:當前page

l  paginator:分paginator

HAYSTACK_SEARCH_RESULTS_PER_PAGE每頁顯示數量

 

改變分詞方式:

1.        安裝jieba分詞模組。

pip install jieba

2.     找到虛擬環境py_django下的haystack目錄。

/home/python/.virtualenvs/bj10_py3/lib/python3.5/site-packages/haystack/backends/

3.     在上面的目錄中建立ChineseAnalyzer.py檔案。

import jieba
from whoosh.analysis import Tokenizer, Token
class ChineseTokenizer(Tokenizer):
    def __call__(self, value, positions=False, chars=False,
                 keeporiginal=False, removestops=True,
                 start_pos=0, start_char=0, mode='', **kwargs):
        t = Token(positions, chars, removestops=removestops, mode=mode, **kwargs)
        seglist = jieba.cut(value, cut_all=True)
        for w in seglist:
            t.original = t.text = w
            t.boost = 1.0
            if positions:
                t.pos = start_pos + value.find(w)
            if chars:
                t.startchar = start_char + value.find(w)
                t.endchar = start_char + value.find(w) + len(w)
            yield t
def ChineseAnalyzer():
    return ChineseTokenizer()

4.     複製whoosh_backend.py檔案,改為如下名稱:

        whoosh_cn_backend.py

5.     打開復製出來的新檔案,引入中文分析類,內部採用jieba分詞。

from .ChineseAnalyzer import ChineseAnalyzer

6.     更改詞語分析類。

查詢
analyzer=StemmingAnalyzer()
改為
analyzer=ChineseAnalyzer()

7.         

8.        

9.        重新建立索引資料

python manage.py rebuild_index

 

9.  購物車模組

如果使用者未登入,則將購物車資料儲存到使用者瀏覽器的cookie中

將購物車的資料轉換為json字串存在cookie

“cart”:‘{ “sku_1”:10, “sku_2”: 20  }’

如果使用者已登入,則將購物車資料儲存到後端的redis中

在使用者登陸的時候,將cookie中的購物車資訊與redis中的購物車進行合併

json模組

將python中的字典轉換為json字串   json.dumps( python字典資料 )

將json字串轉換為python中的字典  json.loads( json字串 )

9.1    新增到購物車

確定前端是否傳遞資料,傳遞什麼資料,什麼格式

確定前端訪問的方式(get  post)

確定返回給前端的什麼資料,什麼格式

9.2    購物車頁面

decimal      python中精度比較高的小數點數字

from decimal import Decimal

9.3    更新購物車

非冪等  /cart/add?sku_id=1&num=2

冪等/cart/update?sku_id=1&finally_num=18

對於同一種行為,如果執行不論多少次,最終的結果都是一致相同的,就稱這種行為是冪等的

對於同一種行為,如果最終的結果與執行的次數有關,每次執行後結果都不相同,就稱這種行為為非冪等

10.       訂單模組

10.1 確認訂單頁面(place order)

從商品詳情頁【立即購買】跳轉過來----把商品存入購物車

從購物車頁面【去結算】跳轉過來

10.2 提交訂單(下單)

python 的兩個時間模組 datetime  time

django中提供了一個支援時區的時間 django.utils.timezone

strftime 將時間型別轉換為字串型別

strptime 將字串型別轉換為時間型別

10.2.1 驗證登入的裝飾器(自定義,返回json資料)

utils/views.py中

10.2.2 事務的使用:

from django.db import transaction

save_id = transaction.savepoint()  # 建立儲存點

transaction.savepoint_rollback(save_id)  # 回退(回滾)到儲存點

transaction.savepoint_commit(save_id)  # 提交儲存點

10.2.3 併發訪問控制

併發

悲觀鎖

SQL語句: select …. for update

Select * from tble where  id fro update


樂觀鎖

查詢時不鎖資料,提交更改時進行判斷

佇列

 

   




10.3    使用者訂單頁面

10.4    訂單支付

10.5    檢查訂單支付狀態

10.6    訂單評論

 

WSGI   併發

伺服器   wsgi  框架部分(動態的業務邏輯處理程式)

總結(主要功能與難點)

1.   B2C  PC電腦端網頁

2.   功能模組:使用者模組  商品模組(首頁、 搜尋、商品) 購物車模組  訂單模組(下單、 支付)

3.   使用者模組:註冊、登入、啟用、退出、個人中心、地址

4.   商品模組:首頁、詳情、列表、搜尋

5.   購物車: 增加、刪除、修改、查詢

6.   訂單模組:確認訂單頁面、提交訂單(下單)、請求支付、查詢支付結果、評論

7.   django預設的認證系統 AbstractUser

8.   itsdangerous  生成簽名的token (序列化工具 dumps loads)

9.   郵件 (django提供郵件支援 配置引數 send_mail)

10. celery (重點  整體認識 非同步任務)

11. 頁面靜態化 (緩解壓力  celery nginx)

12. 快取(緩解壓力, 儲存的位置、有效期、與資料庫的一致性問題)

13. FastDFS (分散式的圖片儲存服務, 修改了django的預設檔案儲存系統)

14. 搜尋( whoosh  索引  分詞)

15. 購物車登入與未登入的結局方案  cookie redis 雜湊

16. ajax 前端用ajax請求後端介面

17. 事務

18. 高併發的庫存問題 (悲觀鎖、樂觀鎖、佇列)

19. 支付的使用流程

20.  nginx (負載均衡  提供靜態檔案)

21. 資料庫主從 (讀寫分離)