Stories

Detail Return Return

【Flask開發】嘿馬文學web完整flask項目第7篇:1.項目目錄實現,2.數據庫的設計【附代碼文檔】 - Stories Detail

🏆🏆🏆教程全知識點簡介: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校驗的函數
        # 返回payload

    3.用户登錄

  • 登錄接口的實現步驟:

    • 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,
user avatar Rocokingdom2024 Avatar yuanfang_648a85b26d85e Avatar RCJL Avatar imba97 Avatar tanggoahead Avatar lovecola Avatar gaozhipeng Avatar nixideshatanku Avatar idiomeo Avatar shuihuyangpinga Avatar zohocrm Avatar daivon Avatar
Favorites 25 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.