🏆🏆🏆教程全知識點簡介:1. 內容 2. 目標 1.1產品與開發 1.2環境配置 1.3 運行方式 1.4目錄説明 2.用户認證 2.1微某信平台 Json Web Token(JWT) 定義路由,書架管理--添加書籍 3.書架 4.1分類列表 5.搜索 5.3搜索-精準&高匹配&推薦 6.小説 6.4推薦-同類熱門推薦 7.瀏覽記錄 8.1配置-閲讀偏好 8.配置 9.1項目部署uWSGI 配置 啓動 9.部署 10.1異常和日誌 10.補充 10.2 flask-restful 1.項目目錄實現 2.數據庫的設計 3.數據庫遷移: 1.JWT:json web token 2.jwt工具的封裝 4.用户權限校驗 5.登錄驗證裝飾器 1.書架列表 2.書架管理 3.最後閲讀 2.分類書籍列表 3.熱門搜索 7.3小説-詳情 2.小説目錄 2.閲讀偏好 3.閲讀設置
<!-- start:bj1 -->
📚📚👉👉👉本站這篇博客: https://segmentfault.com/a/1190000046820539 中查看
📚📚👉👉👉本站這篇博客: https://segmentfault.com/a/1190000046820539 中查看
<!-- end:bj1 -->
✨ 本教程項目亮點
🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考
🎯🎯🎯全教程總章節
🚀🚀🚀本篇主要內容
1.項目目錄實現
-
建議:在單個的腳本文件中,實現基本功能,Flask實現基本程序,基本配置信息數據庫、藍圖,然後,把文件進行拆分。
- 1、在pycharm中新建hmwx_backend項目
- 2、在pycharm中選擇創建的虛擬環境python解釋器
- 3、創建項目啓動文件manage.py,實現Flask的基本程序
- 4、在manage.py文件中,實現項目的基本配置,數據庫配置、腳本管理器、數據庫遷移擴展等
- 5、實現藍圖、工廠函數的封裝
- 6、拆分代碼,首先拆分配置信息config.py,拆分程序實例app的工廠函數,拆分藍圖對象
- 7、後續根據具體的功能,新創建文件或文件夾
2.數據庫的設計
- 根據產品原型進行數據庫的設計;
-
數據庫中需要存儲的數據;
- 表結構
- 字段類型
- 索引設計
- 引擎的選擇
- 詞性分析法,名詞體現表或字段,動詞體現關係。
3.數據庫遷移:
- 前提:數據庫必須先創建。
-
遷移:創建數據庫表;需要使用兩個擴展包;
- flask-script:腳本管理器
- flask-migrate:遷移的框架和命令
-
使用步驟:
- 1、生成遷移倉庫(文件夾):python manage.py db init
- 2、生成遷移腳本:python manage.py db migrate -m init_tables
- 3、執行遷移腳本:python manage.py db upgrade,執行完成,數據庫表創建成功。
bcrypt 文檔
aioredis 文檔
1.JWT:json web token
Psycopg2 文檔
- 概念:字符串;
- 作用:實現狀態保持的一種方案,cookie和session;
-
JWT token:服務器不保存,
- header:頭,存儲基本的加密算法。
- payload:載荷,存儲業務數據,比如用户id,expire過期時間。
- signature:簽名,確保信息不會被修改。
- token = header + payload + signature
2.jwt工具的封裝
- 安裝pyjwt模塊
- 在lib目錄下,封裝jwt_utils.py封裝工具代碼
-
# jwt工具的封裝 # 步驟: # 1.導入jwt模塊 # 2.封裝jwt生成的函數,必須要有密鑰secret_key # 返回token # 3.封裝jwt校驗的函數 # 返回payload3.用户登錄
-
登錄接口的實現步驟:
- 1、獲取參數code
- 2、獲取參數iv、envryptedData
- 3、調用微某信工具,獲取session_key
- 4、根據session_key,調用微某信工具,獲取用户信息
- 5、判斷是否獲取到openID
-
6、保存用户數據
- 查詢mysql數據庫,判斷openID是否存在
- 如果openID不存在,保存用户信息
- 否則,更新用户信息
- 7、調用jwt工具,生成token
- 8、返回數據
-
封裝工具,生成token的有效期
- 有效期:24小時;
- 當前時間:datetime獲取當前時間,時間差操作timedelta
- 總結:
-
1、生成當前時間 2、根據時間差,指定token的過期時間, 3、調用jwt工具,傳入過期時間
4.用户權限校驗
- 需求:在每次請求前,校驗用户的身份信息,從token中提取用户id
- 使用請求鈎子實現,在每次請求前都會執行,@app.before_request
- g對象:應用上下文對象,在請求過程中可以臨時存儲數據。
-
實現步驟:
- 1.封裝工具,/lib/middlewrares.py
- 2.定義函數,獲取用户頭信息,Authorization
- 3.從payload中提取用户id,把用户id賦值給g對象
5.登錄驗證裝飾器
- 需求:取出用户信息後,判斷用户是否登錄,如果登錄後,可以進入視圖,否則不允許進入視圖。
-
實現步驟:
- 1、封裝工具,/lib/decoraters.py
- 2、定義裝飾器
- 3、判斷用户id是否存在,從g對象中嘗試獲取用户id
- 4、返回結果
Jinja2 模板文檔
Flask 部署選項
SQLAlchemy 文檔
1.書架列表
- 用户需要登錄才能訪問,本質是攜帶token
-
實現步驟:在applet_app/新創建藍圖
- 1.添加登錄驗證裝飾器
- 2.默認查詢書架中的所有書籍數據,排序
-
3.判斷查詢結果
- 如果書架沒有書籍,隨機挑選5本書籍,存入書架中
- 4.返回書籍數據
2.書架管理
-
添加刪除操作的準備工作:
- 用户必須要登錄
- 需要參數書籍id
-
添加書架書籍的實現步驟:POST
- 1.添加登錄驗證裝飾器
- 2.接收參數,書籍id
- 3.根據書籍id、用户id,查詢書架表,確認數據的存在
- 4.查詢書架表,確認該書在書架中是否存在
- 5.如果書架中不存在,添加書籍。
-
刪除書架書籍的實現步驟:DELETE
- 1.添加登錄驗證裝飾器
- 2.接收參數,書籍id
- 3.根據書籍id、用户id,查詢書架表,確認數據的存在
- 4.刪除書籍
3.最後閲讀
- 書架中書籍的閲讀情況,用户最後閲讀的書籍,以及對應的章節。
-
實現步驟:
- 1.使用登錄驗證裝飾器,獲取用户信息
- 2.判斷用户是否有閲讀書籍
- 3.如果用户沒有閲讀,默認查詢第一本書籍,當做用户的閲讀書籍
-
4.查詢該書籍的章節信息,默認升序排序,
- 把查詢結果,存入閲讀進度表
- 5.如果用户閲讀書籍,查詢用户閲讀的書籍
- 6.判斷是否有閲讀進度,如果沒有,查詢閲讀進度表
- 7.返回查詢結果
1.分類列表
-
需求:展示書籍分類列表數據,用户分類、書籍分類列表,大分類;
- 實現步驟:
- 1.用户參數,性別參數
- 2.根據性別,查詢大分類數據
tqdm 文檔
- 3.遍歷大分類列表數據,保存
- 4.可以通過關係引用,獲取大分類下面的二級分類數據
- 5.返回分類數據
2.分類書籍列表
- 接口設計:
請求地址:‘/categories/filters’
請求方法:GET
請求參數:
參數名稱 參數類型 是否必須 參數説明
page int True 當前頁數
pagesize int True 每頁書籍數據的條目數
category_id int True 書籍分類id
words int True 數據字數分類
order int True 排序條件
返回結果:
{
'title':名稱,
'author':...
...
}
- 實現步驟:
- 1.獲取參數
- 2.根據分類條件category_id,查詢數據,查詢書籍大分類數據
- 3.判斷查詢結果,根據大分類數據,使用關係引用,獲取二級分類數據
- 4.根據分類數據,查詢書籍表,獲取分類範圍內的書籍數據
- 5.根據字數條件words查詢書籍數據
- 6.根據排序條件order,按照最熱、收藏數量進行排序查詢
- 7.對查詢結果進行分頁處理,paginate
- 8.遍歷分頁數據,獲取每頁數據、總頁數
- 9.轉成json,返回數據
3.熱門搜索
- 保存用户搜索的關鍵詞記錄;
-
實現步驟:GET
- 1.獲取參數,用户搜索的關鍵詞key_word
- 2.根據參數,查詢數據庫,搜索關鍵詞表進行過濾查詢、過濾關鍵詞
- 3.返回查詢結果
1.搜索書本列表
-
接口設計:
- 請求地址:/search/books
- 請求方法:GET
- 請求參數:
參數名稱 是否必須 參數類型 參數説明 key_word True string 搜索的關鍵詞 page True int 頁數 pagesize True int 每頁數據的條目數-
返回數據:
- 書本列表:
'counts':paginate.total, 'pages':paginate.pages, [CatBoost 文檔](https://catboost.ai/) 'page':paginate.page, 'items':items
-
實現步驟:
- 1.獲取參數,key_word/page/pagesize
- 2.檢查關鍵詞參數
- 3.根據關鍵詞參數,對書籍數據庫進行過濾查詢,包含
- 4.判斷查詢結果
- 5.對查詢結果進行分頁處理,items/page/pages
- 6.遍歷分頁後的數據,獲取每本書籍的數據
- 7.返回結果
2.搜索-精準&高匹配&推薦
-
接口設計:
- 請求地址:'/search/recommends'
- 請求方式:GET
- 請求參數:
參數名 參數類型 是否必須 參數説明 key_word string True 用户搜索關鍵詞-
返回結果:
- 精準匹配搜索到的數據
- 高匹配搜索到的數據
- 推薦的數據
-
實現步驟:
- 1.獲取參數搜索關鍵詞,key_word
- 2.根據關鍵詞,搜索SearchKeyWord表
- 3.判斷查詢結果,判斷關鍵詞是否存在,
- 4.如果不存在,保存關鍵詞
- 5.如果存在關鍵詞,count計數加1,如果count大於10,標記為熱門關鍵詞
- 6.定義列表容器,用來存儲7條書籍數據;
- 7.精準匹配1條:根據關鍵詞查詢書籍表,用書籍名稱進行匹配,保存數據;
- 8.高匹配2條:根據書名包含查詢關鍵詞,並且,該書不是精確查詢的數據,默認提取2條,保存數據;
- 9.推薦4條:根據書籍表過濾查詢,不在之前查詢到數據範圍內的書籍,取出4條作為推薦閲讀。
- 返回結果,精準匹配1條、高匹配2條、推薦4條,共7條書籍數據。
7.3小説-詳情
- 在applet_app/book.py文件中實現業務。
1-1 小説-詳情接口設計
rich 文檔
- 接口名稱:小説-詳情
- 接口路徑:/book/:id
- 請求方法:GET
- 請求參數:
| 參數名稱 | 是否必須 | 參數類型 | 參數位置 | 備註 |
|---|---|---|---|---|
| id | True | int | URL路徑參數 | 當前頁數 |
| Content-Type | True | application/json | Headers | 參數類型 |
- 返回數據:
{
"author": "",
"categoryID": 1,
"categoryName": null,
"id": 2,
"imgURL": "http://pu3lpnbqt.bkt.clouddn.com/FjtM8_xf0ZuL83dm_6R0_-Rvrmor",
"introduction": "這是莫離第一次離家...",
"lastChapter": "第九章 小三登堂入室",
"state": 1,
"title": "偏執狂總裁,暗寵嬌妻",
"words": 0
}
PyJWT 文檔
1-2 小説-詳情的基本業務:
- 根據書籍id查詢數據庫書籍表
- 如果用户登錄,查詢數據庫瀏覽記錄表,判斷查詢結果,保存瀏覽記錄
- 如果用户未登錄,根據書籍id查詢數據庫書籍章節表,默認按照倒序排序
- 返回結果
1-3 代碼實現
1、定義book藍圖
from flask import Blueprint
bp = Blueprint('book', __name__)
TutorialsPoint Python
2、定義視圖
Learn Python the Hard Way
@bp.route('/<int:book_id>')
def detail(book_id):
"""
獲取書籍詳情
:param book_id:
:return:
"""
book = Book.query.get(book_id)
if not book:
return jsonify({'msg': '書籍不存在'}), 404
# 添加瀏覽記錄
if g.user_id:
bs = BrowseHistory.query.filter_by(user_id=g.user_id,
book_id=book_id).first()
if not bs:
bs = BrowseHistory(user_id=g.user_id,
book_id=book_id)
bs.updated = datetime.now()
db.session.add(bs)
db.session.commit()
chapter = BookChapters.query.filter_by(book_id=book_id) \
.order_by(BookChapters.chapter_id.desc()).first()
# 返回數據
data = {
'id': book.book_id,
'title': book.book_name,