1. 項目架構

2. 數據庫表結構

3. 數據庫讀寫分離

4. Django讀寫分離配置

新建utils/db_router.py

課后閱讀資料
http://python.usyiyi.cn/documents/django_182/topics/db/multi-db.html
5. 用戶認證模型


注意: AUTH_USER_MODEL配置參數要在第一次遷移數據庫之前配置,否則可能django的認證系統工作不正常
6. 類視圖
將視圖view以類的形式定義
通用類視圖基類:
django.views.generic.View ( 與django.views.generic.base.View 是同一個)
urls.py中配置路由使用類視圖的as_view()方法
由dispatch()方法具體將請求request分發至對應請求方式的處理方法中(get、post等)
擴展閱讀:
http://python.usyiyi.cn/translate/django_182/topics/class-based-views/intro.html
7. 用戶模塊開發
7.1 Django認證系統文檔
http://python.usyiyi.cn/documents/django_182/topics/auth/default.html
7.2 用戶注冊
注冊: 保存數據庫-> 生成token -> 發送郵件
(用戶點擊郵件中的鏈接地址---**的地址)
**:獲取token設置用戶的**狀態
把用戶的id放到token中 簽名
安裝itsdangerous: pip install itsdangerous
文檔 http://itsdangerous.readthedocs.io/en/latest/
安裝celery: pipinstall celery

7.3 用戶**
7.4 用戶登錄
使用redis作為session服務器
安裝命令:pip install django-redis
django-redis文檔:
http://django-redis-chs.readthedocs.io/zh_CN/latest/#
django的session使用文檔:
http://python.usyiyi.cn/documents/django_182/topics/http/sessions.html
登錄-> 保存用戶的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查詢方法的文檔:
http://python.usyiyi.cn/documents/django_182/ref/models/querysets.html
7.7.2 使用redis保存用戶的瀏覽歷史
通過django_redis 的 get_redis_connection(連接名稱) 在程序中使用redis
7.7.3 redis中的用戶瀏覽歷史數據類型選擇
http://redisdoc.com/index.html
http://redis-py.readthedocs.io/en/latest/#indices-and-tables
瀏覽歷史記錄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文檔:
http://python.usyiyi.cn/translate/django_182/ref/files/storage.html
http://python.usyiyi.cn/translate/django_182/howto/custom-file-storage.html

創建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文檔:
http://python.usyiyi.cn/translate/django_182/topics/cache.html
8.5 商品詳情頁
RESTFul
8.6 商品列表頁
分頁
http://python.usyiyi.cn/documents/django_182/topics/pagination.html



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 事務的使用:
http://python.usyiyi.cn/translate/django_182/topics/db/transactions.html
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. 數據庫主從 (讀寫分離)