免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Python基于Flask的寵物商城服務(wù)平臺(tái)全棧實(shí)戰(zhàn):從數(shù)據(jù)建模到Nginx部署

Python基于Flask的寵物商城服務(wù)平臺(tái)全棧實(shí)戰(zhàn):從數(shù)據(jù)建模到Nginx部署 做這個(gè)寵物商城項(xiàng)目的時(shí)候搭完最后一個(gè)模塊回頭再看其實(shí)最花時(shí)間的不是寫代碼反而是前期的技術(shù)選型和模塊規(guī)劃。市面上用 Python 做 Web 開發(fā)框架這關(guān)繞不開我當(dāng)時(shí)手上剛好有一份寵物用品店的線下銷售數(shù)據(jù)想著把商品、訂單、會(huì)員搬到線上做成一套可以真正跑起來的商城平臺(tái)順便把 Flask 從路由到部署的完整鏈路摸一遍于是就有了這個(gè)“Python基于flask的一站式寵物商城服務(wù)平臺(tái)”。項(xiàng)目的定位不是那種幾十個(gè)微服務(wù)的大電商系統(tǒng)而是一個(gè)單體架構(gòu)、功能閉環(huán)、部署輕量的商城平臺(tái)適合剛學(xué)完 Python 基礎(chǔ)想接觸 Web 項(xiàng)目的人也適合想用 Flask 快速交付內(nèi)部工具或小電商站點(diǎn)的開發(fā)者參考。這類的項(xiàng)目最大的價(jià)值在于“麻雀雖小五臟俱全”用戶注冊(cè)登錄、商品展示、購(gòu)物車、訂單、管理后臺(tái)、支付模擬商城該有的核心鏈路基本都覆蓋了。整篇文章我會(huì)按項(xiàng)目設(shè)計(jì)、核心功能、實(shí)操步驟、部署排查四條線展開代碼和步驟都是我自己實(shí)際跑過的你照著做就能復(fù)現(xiàn)一個(gè)能用的商城平臺(tái)。1. 項(xiàng)目定位與技術(shù)選型為什么是Flask而不是別人1.1 這個(gè)寵物商城項(xiàng)目到底是什么先把這個(gè)項(xiàng)目的邊界說清楚。所謂“一站式寵物商城服務(wù)平臺(tái)”核心是把寵物商品交易相關(guān)的角色和流程都收納到一個(gè)系統(tǒng)里用戶在前臺(tái)瀏覽商品、加入購(gòu)物車、下單支付管理員在后臺(tái)管理商品上下架、處理訂單狀態(tài)、維護(hù)類目信息。整個(gè)系統(tǒng)分為前臺(tái)展示和后臺(tái)管理兩個(gè)側(cè)翼共用同一套數(shù)據(jù)庫(kù)和核心服務(wù)。項(xiàng)目代號(hào)里那個(gè)“3hm3o6wk”是我自己起的構(gòu)建標(biāo)識(shí)不用糾結(jié)它的含義就是一次構(gòu)建任務(wù)的編號(hào)。真正的核心是用 Flask 作為 Web 框架配合 SQLAlchemy 做數(shù)據(jù)持久化前端使用服務(wù)端渲染加模板繼承保證頁(yè)面能直接交付使用同時(shí)保留后續(xù)做接口化改造的余地。這個(gè)項(xiàng)目適合誰來學(xué)習(xí)或參考三類人。第一類是想系統(tǒng)練習(xí) Flask 的初學(xué)者通過一個(gè)完整業(yè)務(wù)項(xiàng)目把路由、模板、表單、數(shù)據(jù)庫(kù)、登錄態(tài)這些概念串聯(lián)起來第二類是需要快速搭建內(nèi)部管理系統(tǒng)的開發(fā)者商城的商品和訂單管理模塊稍微改造一下就能變成后臺(tái)工單或庫(kù)存系統(tǒng)第三類是想對(duì)比 Flask 和其他框架差異的人這個(gè)項(xiàng)目里的同步請(qǐng)求模型和擴(kuò)展生態(tài)恰好是和 FastAPI 做對(duì)比的最佳素材。1.2 Flask、Django、FastAPI三選一我的選型依據(jù)不少朋友問我現(xiàn)在新項(xiàng)目為什么不直接上 FastAPI或者干脆用 Django 圖省事。這里我有比較明確的取舍邏輯。FastAPI 主打異步和高性能原生支持 OpenAPI 文檔寫 API 接口確實(shí)很爽。但寵物商城這種業(yè)務(wù)除了接口還有大量服務(wù)端渲染的頁(yè)面、表單校驗(yàn)、Session 狀態(tài)管理FastAPI 在這些場(chǎng)景下要么依賴第三方庫(kù)補(bǔ)齊要么得自己造輪子。如果強(qiáng)行用它項(xiàng)目復(fù)雜度會(huì)明顯上升對(duì)新手也不友好。而且 Flask 和 FastAPI 的編程模型在同步業(yè)務(wù)上非常接近先用 Flask 把業(yè)務(wù)邏輯理順將來哪怕要遷移 FastAPI視圖層的改動(dòng)成本也完全可控。Django 是另一個(gè)極端自帶 Admin 后臺(tái)和 ORM開箱即用的組件很多。但 Djangod 的“約定優(yōu)于配置”也意味著很多東西被框架綁定想改定制化邏輯時(shí)繞路。商城中商品的多規(guī)格、訂單狀態(tài)機(jī)的自定義流轉(zhuǎn)用 Django 的 Model 體系并不是不能做但總覺得被框架推著走。Flask 只做最核心的事——路由和請(qǐng)求上下文——其他東西通過擴(kuò)展自由組合這種“可控的靈活”恰好適合這個(gè)體量的項(xiàng)目。還有個(gè)很實(shí)際的原因Flask 的生態(tài)極度成熟。從用戶認(rèn)證的 Flask-Login到數(shù)據(jù)庫(kù)遷移的 Flask-Migrate再到后臺(tái)管理的 Flask-Admin每個(gè)環(huán)節(jié)都有久經(jīng)考驗(yàn)的擴(kuò)展。這些擴(kuò)展是社區(qū)多年實(shí)踐沉淀下來的踩坑記錄隨便一搜就能找到對(duì)項(xiàng)目落地來說非常友好。所以選 Flask 不是因?yàn)樗钕冗M(jìn)而是因?yàn)樗谶@個(gè)場(chǎng)景下最省心。1.3 數(shù)據(jù)模型與模塊規(guī)劃的總體設(shè)計(jì)做商城項(xiàng)目第一步不是寫代碼而是把所有涉及的數(shù)據(jù)模型理清楚。寵物商城我最終設(shè)計(jì)了六張核心表先說清楚它們的關(guān)系。用戶表User是系統(tǒng)的地基存儲(chǔ)賬號(hào)、密碼哈希、郵箱、注冊(cè)時(shí)間這些基礎(chǔ)信息角色字段用來區(qū)分普通用戶和管理員。類目表Category和商品表Product是上下級(jí)關(guān)系一個(gè)類目下掛多個(gè)商品商品需要包含標(biāo)題、價(jià)格、庫(kù)存、描述、主圖路徑、上下架狀態(tài)。購(gòu)物車表Cart和購(gòu)物車項(xiàng)表CartItem是分開的一個(gè)購(gòu)物車對(duì)應(yīng)多個(gè)條目每個(gè)條目關(guān)聯(lián)一個(gè)商品和購(gòu)買數(shù)量。訂單表Order和訂單詳情表OrderItem同理訂單記錄總金額、訂單狀態(tài)、收貨信息詳情表記錄每個(gè)商品的快照——這里有個(gè)關(guān)鍵設(shè)計(jì)商品信息寫進(jìn)訂單后就不能再關(guān)聯(lián)商品表實(shí)時(shí)讀取因?yàn)樯唐泛髞砜赡芨膬r(jià)或者刪掉歷史訂單必須保留下單那一刻的真實(shí)數(shù)據(jù)。模塊劃分上我按業(yè)務(wù)域拆成四個(gè)藍(lán)圖前臺(tái)商城模塊index藍(lán)圖、用戶認(rèn)證模塊auth藍(lán)圖、訂單交易模塊order藍(lán)圖、后臺(tái)管理模塊admin藍(lán)圖。這種按業(yè)務(wù)域劃分的模式比單純按文件類型劃分比如把所有路由放一個(gè)文件清晰得多。每個(gè)藍(lán)圖自己管自己的模板、靜態(tài)資源和路由后期維護(hù)代碼時(shí)只需要進(jìn)對(duì)應(yīng)的目錄不用在幾百行的路由文件中上下翻找。2. 核心功能模塊逐個(gè)拆解從登錄態(tài)到訂單狀態(tài)機(jī)2.1 用戶認(rèn)證flask-login與Session的配合用戶認(rèn)證是商城系統(tǒng)的第一道門。我在項(xiàng)目中使用了 Flask-Login 擴(kuò)展它做的事情說起來很簡(jiǎn)單幫你管理用戶登錄狀態(tài)的保持、訪問控制、會(huì)話裝載。具體流程是這樣的用戶提交登錄表單后視圖函數(shù)驗(yàn)證用戶名和密碼。密碼用 werkzeug.security 的 generate_password_hash 加密存儲(chǔ)驗(yàn)證時(shí)用 check_password_hash 比對(duì)。確認(rèn)通過后調(diào)用 login_user(user)Flask-Login 會(huì)把用戶 ID 寫進(jìn) Session并幫你維護(hù)一個(gè)current_user全局對(duì)象。后續(xù)請(qǐng)求進(jìn)來時(shí)擴(kuò)展會(huì)自動(dòng)根據(jù) Session 中的 ID 把用戶對(duì)象重新加載出來相當(dāng)于給每個(gè)請(qǐng)求附帶了一個(gè)“當(dāng)前用戶上下文”。這里有幾個(gè)關(guān)鍵細(xì)節(jié)必須處理到位。第一登錄視圖要做登錄跳轉(zhuǎn)保護(hù)也就是login_required裝飾器。沒登錄的用戶訪問購(gòu)物車或訂單頁(yè)面時(shí)應(yīng)該被重定向到登錄頁(yè)登錄成功后再回到之前的頁(yè)面。第二Remember Me 功能默認(rèn)走 Cookie生產(chǎn)環(huán)境中要設(shè)置加密的 Cookie 密鑰否則用戶登錄狀態(tài)很容易被偽造。第三管理員和普通用戶的權(quán)限校驗(yàn)要單獨(dú)做我寫了一個(gè)admin_required裝飾器在login_required的基礎(chǔ)上再加一層角色判斷避免普通用戶直接訪問/admin后臺(tái)地址。2.2 商品與類目ORM模型設(shè)計(jì)的關(guān)鍵細(xì)節(jié)商品模型是整個(gè)商城最核心的表結(jié)構(gòu)直接決定了商品展示和訂單系統(tǒng)的實(shí)現(xiàn)復(fù)雜度。我用 SQLAlchemy 定義模型時(shí)重點(diǎn)考慮了三個(gè)問題。第一個(gè)是類目的層級(jí)關(guān)系。寵物商品類目比較復(fù)雜比如“貓糧”下面還有“幼貓糧”“成貓糧”這樣的二級(jí)類目。為了靈活性我使用自引用外鍵來支持無限層級(jí)Category表里有一個(gè)parent_id字段指向自身的id這樣既能表示頂級(jí)類目也能表示子類目。前臺(tái)展示時(shí)通過一個(gè)遞歸查詢把所有子類目的商品都查出來避免花了分類錢又只能看到一層商品的尷尬。第二個(gè)是商品字段的類型選擇。價(jià)格字段我用Numeric(10, 2)而不是 Float原因很簡(jiǎn)單——Float 在計(jì)算時(shí)會(huì)有精度丟失問題比如 0.1 加 0.2 的經(jīng)典問題訂單金額算錯(cuò)一分錢都麻煩。Numeric(10, 2)能保證小數(shù)點(diǎn)后兩位的精確存儲(chǔ)雖然查詢會(huì)多一層類型轉(zhuǎn)換但對(duì)交易類系統(tǒng)來說準(zhǔn)確性永遠(yuǎn)優(yōu)先。第三個(gè)是圖片和描述的存儲(chǔ)策略。商品的描述我存放在單獨(dú)的字段中因?yàn)閷櫸镉闷繁热缲埣Z的描述往往很長(zhǎng)和商品列表頁(yè)要展示的短標(biāo)題混在一起會(huì)影響列表頁(yè)的查詢性能。主圖只存一張放在靜態(tài)目錄另外保持命名規(guī)范方便和后續(xù)的多圖擴(kuò)展做兼容。2.3 購(gòu)物車實(shí)現(xiàn)會(huì)話級(jí)方案與數(shù)據(jù)庫(kù)方案的取舍購(gòu)物車有兩種常見實(shí)現(xiàn)方案基于 Session 的臨時(shí)購(gòu)物車和基于數(shù)據(jù)庫(kù)的持久化購(gòu)物車。這個(gè)項(xiàng)目我最終選了基于數(shù)據(jù)庫(kù)的方案——用戶登錄后購(gòu)物車數(shù)據(jù)直接存到 Cart 表里。為什么這么選Session 方案確實(shí)簡(jiǎn)單把商品 ID 和數(shù)量存到 Session 里即可不建表也不查庫(kù)。但代價(jià)是購(gòu)物車只能屬于“當(dāng)前瀏覽器會(huì)話”用戶換個(gè)設(shè)備購(gòu)物車就沒了而且無法在后臺(tái)看到所有用戶的購(gòu)物車數(shù)據(jù)。數(shù)據(jù)庫(kù)方案的好處是購(gòu)物車與用戶賬號(hào)綁定換設(shè)備登錄也能恢復(fù)壞處是多一次數(shù)據(jù)庫(kù)讀寫以及需要處理“購(gòu)物車中已有該商品”時(shí)的數(shù)量疊加邏輯。實(shí)現(xiàn)邏輯其實(shí)不復(fù)雜加入購(gòu)物車時(shí)先查當(dāng)前用戶是否已有該商品對(duì)應(yīng)的購(gòu)物車條目有則增加數(shù)量沒有則新增條目。購(gòu)物車首頁(yè)渲染時(shí)遍歷購(gòu)物車條目關(guān)聯(lián)商品表和主圖計(jì)算小計(jì)和總價(jià)。這里有個(gè)小坑用戶在計(jì)算界面時(shí)看到的價(jià)格必須和下單時(shí)一致所以從購(gòu)物車到訂單確認(rèn)頁(yè)需要刷新一次價(jià)格或者干脆再讀取一次數(shù)據(jù)庫(kù)避免前端傳上來一個(gè)被篡改的價(jià)格。2.4 訂單流程狀態(tài)機(jī)設(shè)計(jì)與事務(wù)控制訂單是這個(gè)系統(tǒng)里最容易出 Bug 的地方邏輯復(fù)雜、涉及多張表、還要考慮并發(fā)場(chǎng)景。訂單模塊我設(shè)計(jì)了一個(gè)狀態(tài)機(jī)待支付、已支付、已發(fā)貨、已完成、已取消五個(gè)狀態(tài)。先講狀態(tài)流轉(zhuǎn)。用戶提交訂單后訂單初始狀態(tài)為待支付用戶支付成功后變?yōu)橐阎Ц豆芾韱T發(fā)貨后變?yōu)橐寻l(fā)貨用戶確認(rèn)收貨后變?yōu)橐淹瓿伞H绻脩粼诖Ц稜顟B(tài)下取消或者超時(shí)未支付訂單進(jìn)入已取消狀態(tài)。狀態(tài)機(jī)的好處是讓流程變得可預(yù)測(cè)每個(gè)狀態(tài)能做什么操作、狀態(tài)間能不能跳躍都由代碼明確約束不依賴開發(fā)者的臨場(chǎng)記憶。再講事務(wù)控制。創(chuàng)建訂單這個(gè)動(dòng)作涉及多張表的同時(shí)更新創(chuàng)建訂單主記錄、創(chuàng)建訂單詳情、扣減庫(kù)存、清空購(gòu)物車。任何一個(gè)環(huán)節(jié)失敗整個(gè)操作都應(yīng)該回滾。我使用了 SQLAlchemy 的db.session.commit()來統(tǒng)一提交任何一步拋異常就執(zhí)行db.session.rollback()。注意一個(gè)細(xì)節(jié)扣減庫(kù)存要使用原子更新語(yǔ)句Product.query.filter_by(id...).update({Stock: Product.stock - quantity})不能用“讀出來算完再寫回去”的方式后者在并發(fā)場(chǎng)景下會(huì)超賣。下單的流程還涉及收貨地址管理。這個(gè)項(xiàng)目簡(jiǎn)化處理收貨地址直接存在 Order 表里由用戶在下單時(shí)手動(dòng)填寫。更復(fù)雜的系統(tǒng)會(huì)把地址獨(dú)立成表支持多地址管理但作為單體小平臺(tái)這種簡(jiǎn)化讓表結(jié)構(gòu)更清晰也不影響核心鏈路跑通。2.5 管理后臺(tái)與支付模擬能跑通但不越權(quán)管理后臺(tái)我用 Blueprint 單獨(dú)實(shí)現(xiàn)并通過 Flask-Admin 來加速開發(fā)。商品管理、類目管理、訂單管理三大模塊頁(yè)面包含了基礎(chǔ)的增刪改查以及商品上下架、訂單狀態(tài)的變更操作。這里有個(gè)經(jīng)驗(yàn)管理后臺(tái)的權(quán)限校驗(yàn)比功能更重要。我的實(shí)現(xiàn)是在 dispatch_request 階段統(tǒng)一加權(quán)限判斷所有 admin 藍(lán)圖下的請(qǐng)求先檢查當(dāng)前用戶角色。實(shí)際使用中這個(gè)配置比在每一個(gè)視圖函數(shù)里重復(fù)寫裝飾器安全得多漏一處都可能變成安全隱患。支付環(huán)節(jié)是這個(gè)項(xiàng)目里唯一的“模擬”部分。真實(shí)的支付需要接入微信支付或支付寶涉及商戶號(hào)、證書、回調(diào)驗(yàn)簽等一堆和業(yè)務(wù)無關(guān)的復(fù)雜度。作為學(xué)習(xí)項(xiàng)目我用一個(gè)“模擬支付頁(yè)面”代替用戶點(diǎn)擊支付按鈕后系統(tǒng)直接生成支付成功回調(diào)然后把訂單狀態(tài)更新為已支付。這樣做既不阻塞核心流程學(xué)習(xí)又明確了真實(shí)環(huán)境中支付模塊所在的接口位置。如果你要接入真實(shí)支付把模擬支付函數(shù)內(nèi)部換成 API 調(diào)用即可狀態(tài)流轉(zhuǎn)邏輯完全不變。3. 實(shí)操記錄從零搭建一個(gè)可運(yùn)行的商城平臺(tái)3.1 環(huán)境準(zhǔn)備與項(xiàng)目初始化先說環(huán)境。這個(gè)項(xiàng)目依賴 Python 3.8 以上版本我用的是 3.10。創(chuàng)建虛擬環(huán)境是第一步這一步能避免把項(xiàng)目依賴裝進(jìn)全局環(huán)境導(dǎo)致各種版本沖突。# 創(chuàng)建并激活虛擬環(huán)境 python -m venv venv source venv/bin/activate # Windows下使用 venv\Scripts\activate # 安裝核心依賴 pip install flask pip install flask-sqlalchemy pip install flask-login pip install flask-migrate pip install flask-wtf pip install flask-admin依賴裝好后項(xiàng)目目錄結(jié)構(gòu)我按“按模塊分包按資源分目錄”的原則組織petshop/ ├── app.py # 應(yīng)用入口 ├── config.py # 配置文件 ├── extensions.py # 擴(kuò)展實(shí)例化 ├── models/ # 數(shù)據(jù)模型 │ ├── user.py │ ├── category.py │ ├── product.py │ ├── cart.py │ └── order.py ├── blueprints/ # 業(yè)務(wù)藍(lán)圖 │ ├── auth.py │ ├── main.py │ ├── order.py │ └── admin/ ├── templates/ # 模板文件 ├── static/ # 靜態(tài)資源 └── migrations/ # 數(shù)據(jù)庫(kù)遷移腳本使用應(yīng)用工廠模式來初始化 Flask 應(yīng)用這一步是保證項(xiàng)目可以靈活配置的關(guān)鍵。工廠函數(shù)的好處是測(cè)試、生產(chǎn)部署、多實(shí)例運(yùn)行都可以通過傳入不同配置對(duì)象來創(chuàng)建應(yīng)用實(shí)例不會(huì)出現(xiàn)全局變量繞來繞去的問題。# app.py from flask import Flask from extensions import db, login_manager, migrate def create_app(config_namedefault): app Flask(__name__) app.config.from_object(config[config_name]) # 初始化擴(kuò)展 db.init_app(app) migrate.init_app(app, db) login_manager.init_app(app) # 注冊(cè)藍(lán)圖 from blueprints.main import main_bp from blueprints.auth import auth_bp from blueprints.order import order_bp from blueprints.admin import admin_bp app.register_blueprint(main_bp) app.register_blueprint(auth_bp, url_prefix/auth) app.register_blueprint(order_bp, url_prefix/order) app.register_blueprint(admin_bp, url_prefix/admin) return app app create_app()3.2 業(yè)務(wù)功能的實(shí)現(xiàn)思路與關(guān)鍵代碼核心的幾個(gè)業(yè)務(wù)功能我把最有代表性的實(shí)現(xiàn)思路寫在下面你可以直接照著落地方案。商品列表頁(yè)的分頁(yè)處理是商城的基礎(chǔ)能力。數(shù)據(jù)量一旦超過幾十條一次性渲染所有商品會(huì)讓頁(yè)面很卡。我做分頁(yè)的思路是查詢時(shí)直接調(diào)用 SQLAlchemy 的paginate方法配置每頁(yè) 12 個(gè)商品并傳入page參數(shù)控制當(dāng)前頁(yè)碼。分頁(yè)組件的頁(yè)碼渲染用 Jinja2 宏處理把上一頁(yè)、下一頁(yè)和跳轉(zhuǎn)邏輯統(tǒng)一封裝頁(yè)面代碼干凈很多。搜索功能也和商品模塊耦合在一起。用戶在搜索框輸入關(guān)鍵詞后當(dāng)前端點(diǎn)擊搜索按鈕時(shí)后端構(gòu)建一個(gè)ilike模糊查詢。注意這里用ilike而不是like是因?yàn)閕like在 SQLite 和 PostgreSQL 下都默認(rèn)忽略大小寫搜索體驗(yàn)更友好。商品詳情頁(yè)有一個(gè)很關(guān)鍵的性能點(diǎn)點(diǎn)擊進(jìn)入詳情頁(yè)時(shí)順便查詢商品所屬類目并把同類的其他商品查出來作為“相關(guān)推薦”。我的實(shí)現(xiàn)是做一個(gè)簡(jiǎn)單的“猜你喜歡”功能按同一類目隨機(jī)取四個(gè)商品展示在詳情頁(yè)底部。這樣頁(yè)面內(nèi)容更豐富也增加了用戶的瀏覽深度。購(gòu)物車的數(shù)量修改列使用 AJAX 請(qǐng)求。用戶點(diǎn)擊加減按鈕時(shí)前端發(fā)送 POST 請(qǐng)求到/cart/update后端校驗(yàn)商品數(shù)量不能為負(fù)數(shù)后更新購(gòu)物車條目然后返回新的小計(jì)金額。前端拿到結(jié)果更新頁(yè)面不用整頁(yè)刷新交互體驗(yàn)流暢不少。訂單創(chuàng)建的視圖函數(shù)和數(shù)據(jù)庫(kù)事務(wù)綁定在一起。我會(huì)詳細(xì)講一下這里的關(guān)鍵代碼路徑。前端請(qǐng)求創(chuàng)建訂單視圖函數(shù)里第一步生成一個(gè)唯一的訂單編號(hào)我用的是時(shí)間戳加用戶 ID 再加四位隨機(jī)數(shù)的組合保證并發(fā)下也不會(huì)重號(hào)。第二步從購(gòu)物車?yán)镒x取商品組裝訂單詳情。第三步調(diào)用支付模擬接口把訂單狀態(tài)從待支付更新為已支付。第四步扣減庫(kù)存。最后統(tǒng)一提交事務(wù)并清空購(gòu)物車。order_bp.route(/create, methods[POST]) login_required def create_order(): cart_items CartItem.query.filter_by(user_idcurrent_user.id).all() if not cart_items: flash(購(gòu)物車是空的無法創(chuàng)建訂單, warning) return redirect(url_for(main.cart)) order Order( order_nogenerate_order_no(), user_idcurrent_user.id, total_amountsum(item.product.price * item.quantity for item in cart_items), statuspending_payment ) db.session.add(order) for item in cart_items: product item.product # 協(xié)變更新庫(kù)存 Product.query.filter_by(idproduct.id)\ .update({stock: Product.stock - item.quantity}) order_item OrderItem( order_idorder.id, product_idproduct.id, product_nameproduct.title, priceproduct.price, quantityitem.quantity ) db.session.add(order_item) db.session.delete(item) # 移出購(gòu)物車 try: db.session.commit() except Exception: db.session.rollback() flash(訂單創(chuàng)建失敗請(qǐng)重試, danger) return redirect(url_for(main.cart)) return redirect(url_for(order.detail, order_idorder.id))這段代碼里有兩個(gè)重點(diǎn)注釋。第一個(gè)是庫(kù)存扣減用了原子更新的寫法避免讀取舊值后并發(fā)寫覆蓋的問題。第二個(gè)是訂單詳情的商品快照product_name和price字段把下單時(shí)的商品信息固化在訂單里就算商品之后改價(jià)或刪除歷史訂單的數(shù)據(jù)也不會(huì)變。3.3 表單、CSRF與文件上傳這些細(xì)節(jié)怎么處理商城系統(tǒng)里用戶交互多表單就特別多登錄、注冊(cè)、搜索、下單、后臺(tái)商品編輯每一個(gè)都需要驗(yàn)證用戶輸入。我用 Flask-WTF 擴(kuò)展來管理所有表單這個(gè)庫(kù)把 CSRF 防護(hù)、字段校驗(yàn)、錯(cuò)誤提示都做進(jìn)了框架。CSRF 防護(hù)是安全問題中最容易忽略但也最重要的一個(gè)。Flask-WTF 默認(rèn)會(huì)為每個(gè)表單自動(dòng)注入 CSRF 令牌提交時(shí)校驗(yàn)令牌防止跨站請(qǐng)求偽造攻擊。生產(chǎn)環(huán)境部署時(shí)你必須配置一個(gè)足夠隨機(jī)的SECRET_KEY這是生成 CSRF 令牌的根密鑰千萬不能用默認(rèn)值或?qū)懰涝诖a里。我通常從環(huán)境變量加載開發(fā)環(huán)境才用回退值。文件上傳這個(gè)點(diǎn)也很容易踩坑。后臺(tái)添加商品時(shí)要傳圖片F(xiàn)lask 接收文件對(duì)象后要先判斷文件后綴是否在允許列表里圖片只接收 jpg、png、gif 和 webp再判斷文件大小上限。我用app.config[MAX_CONTENT_LENGTH]把上傳大小限制在 5MB避免有人往服務(wù)器塞大文件。文件保存到static/uploads目錄后生成的文件名用的是 UUID 加后綴不讓用戶控制原始文件名防止路徑穿越問題。這里分享一個(gè)給新手的建議不要把文件存到數(shù)據(jù)庫(kù)的 BLOB 字段里也不要直接跟隨手寫一個(gè)文件上傳接口就完事。使用Flask-Uploads或werkzeug.utils.secure_filename來處理文件名和路徑代碼量少安全性高很多。我實(shí)際用的是secure_filename加 UUID 組合既防御了文件路徑攻擊又保證了文件名的唯一性。4. 常見問題與部署排查實(shí)錄那些讓我撓頭的問題4.1 開發(fā)環(huán)境下的一些高頻坑點(diǎn)在開發(fā)過程中我遇到的第一類問題集中在數(shù)據(jù)庫(kù)相關(guān)操作上。最經(jīng)典的是 SQLAlchemy 的db.session作用域問題。很多人寫完查詢后不關(guān) session或者隨便用db.session.remove()結(jié)果出現(xiàn)不同請(qǐng)求之間的數(shù)據(jù)相互污染。正確做法是把db.session的生命周期交給 Flask-SQLAlchemy 管理它會(huì)按請(qǐng)求上下文自動(dòng)創(chuàng)建和釋放 session不要在視圖函數(shù)里手動(dòng)調(diào)close()。第二個(gè)高頻問題來自 Flask 的redirect和url_for。尤其是商城這種帶藍(lán)圖的系統(tǒng)URL 生成必須帶藍(lán)圖名否則很容易 404。比如url_for(auth.login)和url_for(main.index)是有區(qū)別的少寫藍(lán)圖名直接報(bào)構(gòu)建錯(cuò)誤。排查這種問題的方法是先把所有端點(diǎn)的名字列出來然后對(duì)照視圖函數(shù)確認(rèn)藍(lán)圖前綴。第三個(gè)坑點(diǎn)是模板和靜態(tài)文件的路徑。用藍(lán)圖之后模板文件的查找規(guī)則是按藍(lán)圖注冊(cè)名稱在模板目錄里搜索如果兩個(gè)藍(lán)圖下有同名模板比如都想用index.html必須放到各自的子目錄里區(qū)分否則后注冊(cè)的藍(lán)圖會(huì)覆蓋前面藍(lán)圖里的模板。第四個(gè)問題也很隱蔽表單校驗(yàn)失敗時(shí)的錯(cuò)誤回顯。Flask-WTF 校驗(yàn)失敗后表單對(duì)象會(huì)把錯(cuò)誤信息放進(jìn)form.errors但如果你在render_template時(shí)沒有傳遞這個(gè)字段頁(yè)面就會(huì)白白丟失錯(cuò)誤提示。我在模板里寫了一個(gè)render_field宏統(tǒng)一格式化表單中的label、input和錯(cuò)誤提示樣式一致維護(hù)也容易。4.2 部署上線前的性能優(yōu)化清單項(xiàng)目在本地跑順之后部署到服務(wù)器前還有幾個(gè)重要優(yōu)化點(diǎn)我的實(shí)操經(jīng)驗(yàn)如下。第一關(guān)閉調(diào)試模式。app.run(debugTrue)是開發(fā)環(huán)境專用的正式部署時(shí)不但性能差更重要的是調(diào)試器的 WERKZEUG 終端可以在遠(yuǎn)程執(zhí)行代碼安全隱患極大。部署環(huán)境務(wù)必debugFalse。第二開啟模板緩存。Flask 默認(rèn)每次請(qǐng)求都會(huì)重新編譯模板開發(fā)環(huán)境方便改動(dòng)即時(shí)生效生產(chǎn)環(huán)境則完全沒必要。在 config 里設(shè)置TEMPLATES_AUTO_RELOAD False之后模板只有重啟應(yīng)用才會(huì)更新。第三給靜態(tài)資源加緩存頭。商品圖片、CSS、JS 這類不經(jīng)常變的文件可以在 Nginx 層配置瀏覽器緩存。這樣用戶第二次訪問頁(yè)面時(shí)大部分資源直接從本地緩存讀取明顯降低服務(wù)器帶寬壓力。第四使用生產(chǎn)級(jí)的 WSGI 服務(wù)器。Flask 內(nèi)置的app.run()是開發(fā)服務(wù)器單進(jìn)程、并發(fā)能力十分有限。我部署時(shí)使用 Gunicorn配置 3 個(gè) worker 進(jìn)程多個(gè)進(jìn)程并行處理請(qǐng)求。安裝命令pip install gunicorn gunicorn -w 3 -b 127.0.0.1:8000 app:appGunicorn 的-w參數(shù)指定 worker 數(shù)量一般按 CPU 核心數(shù)加 1 的原則配置比如 2 核服務(wù)器開 3 個(gè) worker。如果后端還用到了線程進(jìn)程數(shù)可以再稍微調(diào)低避免 CPU 過度切換。注意Gunicorn 只支持類 Unix 系統(tǒng)Windows 部署要用 Waitress 代替。等價(jià)的啟動(dòng)命令是waitress-serve --port8000 app:app。4.3 Nginx反向代理與數(shù)據(jù)庫(kù)遷移把 Gunicorn 跑起來后還需要一層 Nginx 做反向代理。反向代理解決的問題是Nginx 監(jiān)聽公網(wǎng)端口80/443把請(qǐng)求轉(zhuǎn)發(fā)給本地 Gunicorn 端口8000。這樣靜態(tài)資源由 Nginx 直接服務(wù)動(dòng)態(tài)請(qǐng)求才打到 Python 進(jìn)程能把 Web 服務(wù)器和 Python 進(jìn)程的優(yōu)勢(shì)都發(fā)揮出來。Nginx 配置的核心部分如下server { listen 80; server_name your-domain.com; location /static/ { alias /path/to/petshop/static/; expires 7d; } location / { proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }數(shù)據(jù)庫(kù)遷移這一塊我在開發(fā)初期就部署了 Flask-Migrate這是基于 Alembic 的遷移工具。開發(fā)階段每改一次模型執(zhí)行一次遷移腳本生成命令即可記錄表結(jié)構(gòu)變化flask db init flask db migrate -m init tables flask db upgrade上生產(chǎn)環(huán)境時(shí)先把本地遷移腳本同步到服務(wù)器然后執(zhí)行flask db upgrade即可完成表結(jié)構(gòu)的創(chuàng)建和升級(jí)完全不用手工寫 SQL。唯一要注意的是flask db migrate命令不會(huì)自動(dòng)發(fā)現(xiàn)所有模型必須確保模型文件在應(yīng)用入口處被 import 過否則遷移腳本會(huì)漏掉表。最后講一個(gè)部署后最常見的坑忘記配置SECRET_KEY環(huán)境變量導(dǎo)致重啟后所有登錄會(huì)話失效用戶被強(qiáng)制退出。這個(gè)問題的根源是 Flask 的 Session 是靠密鑰簽名校驗(yàn)的密鑰變了簽名就失效。因此在生產(chǎn)環(huán)境務(wù)必通過環(huán)境變量注入固定的密鑰不要?jiǎng)討B(tài)生成也不要用寫死的默認(rèn)值。5. 項(xiàng)目延展與改進(jìn)空間這個(gè)商城還可以怎么進(jìn)化項(xiàng)目跑通、部署上線這只是一個(gè)起點(diǎn)。寵物商城這個(gè)項(xiàng)目天然帶了很多可擴(kuò)展方向。先說數(shù)據(jù)庫(kù)層面當(dāng)前的 SQLite 在開發(fā)時(shí)完全夠用但如果真的要承載線上流量建議盡早切換到 MySQL 或 PostgreSQL。切換方式很簡(jiǎn)單改一下數(shù)據(jù)庫(kù)連接 URI再執(zhí)行一遍flask db upgrade代碼層面幾乎沒有變動(dòng)這就是用 SQLAlchemy 的好處。再說功能層面?,F(xiàn)在商城只支持簡(jiǎn)單的商品單規(guī)格寵物食品這類商品往往有口味、重量的區(qū)別可以考慮加規(guī)格表SKU 表。SKU 表關(guān)聯(lián)商品表每個(gè)規(guī)格擁有獨(dú)立的價(jià)格和庫(kù)存下單時(shí)選擇具體規(guī)格。這個(gè)改造會(huì)涉及商品詳情頁(yè)、購(gòu)物車條目、訂單明細(xì)三層工作量不小但對(duì)真實(shí)商城來說是必需品。還可以把用戶評(píng)價(jià)和收藏功能加進(jìn)去。評(píng)價(jià)要在訂單完成之后開放權(quán)限保證只有真實(shí)購(gòu)買過的用戶才能評(píng)價(jià)收藏功能的實(shí)現(xiàn)則比購(gòu)物車還簡(jiǎn)單一張收藏表關(guān)聯(lián)用戶和商品即可。這兩個(gè)功能能顯著提升用戶粘性而且不會(huì)破壞現(xiàn)有表結(jié)構(gòu)適合作為練習(xí)項(xiàng)目自己在本地動(dòng)手加一加。最后是接口化改造。當(dāng)前項(xiàng)目是服務(wù)端渲染模式頁(yè)面和接口混在一起。如果未來要開發(fā)小程序或者 App可以把視圖函數(shù)逐步改造成 JSON API配合 Flask 藍(lán)圖劃分按藍(lán)圖逐個(gè)改造不需要一步到位。這也印證了選型時(shí)的一個(gè)觀點(diǎn)——Flask 的靈活度讓你在項(xiàng)目演進(jìn)時(shí)有一定騰挪空間而不是被框架限制住手腳。關(guān)于這個(gè)寵物商城項(xiàng)目我個(gè)人的體會(huì)是做一個(gè)完整的業(yè)務(wù)項(xiàng)目收獲最大的不是熟練了哪個(gè)框架而是理解了“從需求到數(shù)據(jù)模型從數(shù)據(jù)模型到頁(yè)面交互”的整個(gè)鏈路。這種全局的視角是零散刷教程和做單點(diǎn)練習(xí)完全給不了的。如果你正在學(xué)習(xí) Flask找一個(gè)類似的完整業(yè)務(wù)場(chǎng)景從數(shù)據(jù)庫(kù)設(shè)計(jì)開始一步步做到部署上線這個(gè)過程本身抵得上十遍教程。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
久婷婷| 天天干、天天日日| 婷婷日本色| 五月天激情站| 草榴视频黄色网| 日韩久久这里只有精品| www. 五月. com| 99re这里| 激情五月天丁香| 狠狠五月天| 七七九九色色| av在线不卡播放| 另类视频五月天| 久久久久久五月天| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | av在线不卡播放| 亚洲热久久| 婷婷六月综合| .精品久久久麻豆国产精品| 欧美猛片| 日韩欧美成人片| 日本99视频| 开心四月婷婷在线色播播| 欧美搡BBBBB摔BBBBB| 色播丁香婷婷五月激情| \\五月天婷婷激情| 日韩无码专区| 婷婷自拍| 99精品视频免费观看近期发布| 婷婷丁香成人网址| www.99色| 再次出发二| 999激情视频| 国产肥白大熟妇BBBB视频| 欧美VA在线观看| 激情六月丁香综合| 色狠狠伊人久久五月丁香| 大香蕉久久久| 丁香婷婷精品视频| 国产激情av| 五月天婷婷色| 91久操| 天天干天天干天天干天天干天天干天天干天天| 激情伊人五月婷婷久久| 天天模,夜夜模夜夜爽| 丁香婷婷五月人体| 国产成人综合亚洲| 1024人妻无码中文字幕| 亚洲欧洲中文日韩久久AV乱码| 久久激情五月| AV在线观看网站| 黄网网站在线播放| 九九久久高清| 婷婷亚洲久久| 欧美人人草草| 久久看九九90| 婷婷五月丁香基| 伊人久久大香网| 亚洲视频二区| 99热精品在线| 99精品在线观看| 中文av网站| 婷婷五月激情欧美大胆视频| 中文av网站| 九九re精品视频在线观看| 天天日夜夜夜操操操操| AV性爱在线| 亚洲十月婷婷综合| 中文字幕乱轮| 丁香六月五月天| 五月婷婷六月激情网| 婷婷五月色网| 久久538| 婷婷五月天激情小说| 狠狠色综合网站| 人。妻久久| 丁香激情五月| 思思热在线视频精品| 九九色色| 天天操五月天| 99激情网| 五月婷婷五月天激情视频| 色婷婷91激情小说| 99综合网| 大香蕉人妻| 120分钟婬片免费看| 色色色热| 中文字幕激情综合| 久久视频66| 操91| 人人干人人看| 99riAV成人在线视频| 内射干少妇亚洲69XXX| 伊人丁香在线| 日韩精品一区二区亚洲AV观看| 全高清无码视頻| 九九热这里只有精品556| 夜夜天天久久婷婷| 五月激情站| 五月丁香六月婷| 中文AⅤ大全| 99精品一二三四视频| 久婷婷五月丁香在线观看| 激情五月狠狠| 五月天婷婷激情在线色图| 色五月婷婷亚洲| 91国产精品视频播放| 六月婷婷激情| 婷婷丁香色五月| 丁香五月天资源网| 亚洲精品无码A片一区二区| 91精品国产99久久久久久天美| 久久这里只有精品网| 99热爱爱干干日| 精品成人无码A片观看香草视频| 婷婷亚洲久久| 婷婷五月天亚洲五码| 日本不卡高字幕在线2019| 爽tv | 欧在线一区| 丁香五月欧美色综合| 久香草视频在线观看| 五月婷婷av| 婷婷成人在线| 天天日夜夜曹| 少妇性按摩无码中文A片| 亚洲AV日韩在线观看| 久久婷五月| 五月丁香六月婷婷中文版| 伊人网啪啪| 亚洲第一综合| 婷婷五月天天天日日夜夜| 欧洲色| www.婷婷激情网.com| 天天爽夜夜爽夜夜爽精| 99热在线播放| 五月婷婷丁香六月在线| 超碰69天堂| 亚洲久久视频| 激情五月天婷婷丁香| 精品久久婷婷| 超碰二区| 99黄色性生活| 狼人婷婷久久| 五月激情射| 亚洲视频伍月婷婷| www.91热久久| 人妻精品一区二区三区| 五月天色综合| 日本操碰碰| 超碰婷婷色| 五月激情精品视频| 啪啪啪大香蕉| 青青草婷婷综合五月| 综合av在线| 综合AV在线| 影音先锋91资源站| 中文字幕黄色电影网址| 久久精品婷婷| 色人久久| 欧美性生交XXXXX无码小说| 操人妻90p| 亚洲另类婷婷综合| 五月人人丁香婷婷五月人人丁香| 亚洲精级| 99久超碰| 激情av| 色播丁香| 99精品在线下载| 国产乱子轮XXX农村| www开心激情网| 欧美日本不卡黄色片| 99精吕视频在线观看了| 综合亚洲六月婷婷在线| 亚洲激情av| 亚洲五月天伊人| 九九激情网| 天天综合情| 大香蕉婷婷五月| 五月天久久婷婷| 天天精品视频免费观看| 激情五月狠狠| 国产99热| 国产女人十八水真多1| 久久 视频这里只有精总| 成人网站高清无码| 99精品国产乱码久久久人妻| 天天做天天爱天天玩| 久久婷婷五月综合伊人| 日本久久天堂| 99热免费在线| 色五月视频无码播放| www.色色com| 久久色婷婷| 熟女乱论网| 久久婷婷电影| 天天激情站| 婷婷五月天激情小说网站| 激情久久丁香| 偷拍九九热| 久久92| 午夜不卡成人一区二区| 久操大香蕉| www.com久久久久久久久久久久久久久久久| 丁香五月天亚洲视频| 丁香五月天在线观看视频| www.一区二区三区| 丰满老熟妇BBBBB搡BBB| 久久久久这里只有精品| 天天色域综合网| 丁香五月天啪啪| 99久久婷婷国产综合亚洲| 婷婷综合精品视频97| 婷婷五月天六点丁香五月| 丰满少妇猛烈A片免费看观看| 九九热精品99| 6080av| www.maotanji.com| 国产三级在线播放| 久久久高清| 日韩色色视频| 99精品在线观看视频| 婷婷狠狠色| 婷婷五月蜜桃成人桃色丁香| 日韩成人综合网| 婷婷久久婷婷色五月| 天天弄天天操| 天天狠狠夜夜狠狠2023| 人人噜天天上| 深爱婷婷丁香五月激情| 欧洲亚洲激情五月天在线| 思思久久网| 国产av天天插天天操天天爽| 少妇出轨做爰高潮A片| 91久久99久久91熟女精品| 国产成人亚洲综合A∨婷婷| www天天干| 亚洲五月婷| 久久婷视频| 91人妻PORNY九色大屁股| 大香蕉狼人久久| 丁香五月六月欧美| 强辱丰满人妻HD中文字幕| 激情色色| 丁香婷婷色五月| AV成人在线播放| 五月婷婷亚洲| 五月丁香好婷婷A片网| 26uuu另类亚洲欧美日本一| 婷婷综合五月激情| 亚洲黄色精品| 蜜臀AV在线成人| 91色婷婷综合久久中文字幕二区| 色玖玖爱| 久久老码第一| 欧美性丁香色色五月天| 五月婷婷丁香俺日污视频| 丁香五月婷婷色| 色人妻五月| 伊人婷婷青青cao| 色狠狠色综合久久久绯色AⅤ影视| 五月综合丁| 丁香九色不卡aaa| 超级碰碰碰久久网站| 天堂网操| 综合AV在线| 成人网站在线观看视频| 青青草蜜臀| www.minyis.com【JT】币址百万U预算可预付QQ2101460746 | 色99自拍| 思思热思在线精品视频| 色五婷婷| 成人在线网| 五月婷婷综合网| 婷婷五月天色色| 国产69精品久久久久999小说| 婷婷丁香无码专区| 97亚洲视频在线| 精品久9| 日本一区二区三区精品视频| 中文无码婷婷| 免费久久这里只有精品99| 99这里是精品| 直接看的AV| 丁香网站| 婷婷伊人综合| 日韩一级片| 99热热九九| 99热精品一| 停停五月色宗合| 人人97碰| 亚洲婷婷综合视频| 深爱激情网五月| 六月丁香婷婷在线波多| 久久性视频| 亚洲妇女熟BBW| 中文成人在线| 婷婷激情蜜桃玖玖丁香| 婷婷五月天综合网| 国产精品黑丝| 这里只有精品,日韩视频| 一本综合丁香日日狠狠色| 青青草轻轻操| YW无码| 97操操操| 婷婷爱五月| 成人片黄网站色大片免费毛片| 一区二区乱视频码| oVV4WIB3vFi8D| 色丁香五月婷婷| 成人免费120分钟啪啪| 九九美女视频| 涩五月丁香| 久操热线| 99色色| 五月婷婷六月婷| 五月丁香六月激情综合欧美| 午夜天堂一区人妻| 开心婷婷中文字慕| www.精品99| 久久婷婷五月综合网| 伊人干综合| 无码 色| 超碰91在线| 婷婷色色欧美| 欧美婷婷成人| 爆乳熟女-区二区三区| 丁香六月婷婷五月天| 99热这里有精品| 国产 码在线成人网站| 色天使色综合| 99热99干| 五月天另类小说久久小说网| 四色女婷婷| 婷婷金品综合视频| 激情五月综合网最新| 丁香五月电影| 日韩三级视频一区二区| 日本五月婷| 亚洲色频| 国产裸舞福利资源在线视频| 婷婷激情五月| 婷婷色香六月综合激情| 亚洲欧洲中文日韩久久AV乱码| 激情文学久久| 色五月在线观看| 久久9热| 99色网站| 欧美综合123区| 日日噜噜夜夜狠狠久久丁香五月| 91视频久久久| 大香蕉伊人99| 99,色| 久热人妻| 99热大全在线观看| 欧美黑人巨大性生话| 激情五月激情综合网一级丸片| 俺去也五月| 成人噜噜网| 天天色综网| caop在线| 婷婷五月天网| 狠狠久综合| 五月婷视频| dingxiangtingtingliuyue| 日韩欧美不卡| 99热这里只有精品在线观看| 99热爱爱干干日| 色九区| 五月色婷| 色视频色综合91| www.夜夜騎夜夜狠| 超碰97久久| 天天综合网亚洲综合网| 久热伊人在91| 欧美黄色AA片哗啦啦啦| 亚洲 无码 中文字幕 中出| 69热91天堂| 99精品免费欧美小视频| 狠狠色色| 五月丁香综缴情性爱| 婷婷五月视屏| 亚洲婷婷视频| 丁香五月婷婷影视先锋| 婷婷九九| 成 久久| 卡视频1区2区| 亭亭玉月丁香| 涩涩涩五月天| 黄色99视频| 99燥99日| 亚洲精品视频在线| 色五狠狠| 伊人影音无码一区二区三区| 日噜噜色| 97av在线视频| 久草狼人| 99精品爱| 99er这里只有精品| 激情婷| 五月天伊人网| 夜夜夜夜撸夜夜操| 一个色的综合| 色热久| 成熟妇人A片免费看网站| 婷婷干五月综合在线播放| 成人网址在线观看| 激情五月天婷婷丁香| 大香蕉520| WWW.夜夜| 99热香港| 草草视频91| 婷婷色色色| 99热精品中文字幕| 99视频精品在线| 久久婷婷六月| 97操视频| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 99精品国产在热久久婷婷| 97精品人人A片免费看| 热99这就是精品视频| 玖玖伦理电影| 狠狠综合网| www网站在线观看| 色色色网站| 欧美性爱一区| 久久婷婷五月| 日本五月婷| 婷婷五月天激情综合| 亚洲成人在线综合| 日本理论久久| 在线不卡的视频| 国产精产国品一二三在观看| 激情五月天婷婷视频| 丁香五月性爱| 久久ww| 噜噜狠狠色综合久| 伊人大香蕉在线视频| 丁香五月婷婷色综合| 欧美性爱五月天| 色综合久久99色| 色色性爱视频| 五月丁香六月婷婷姐| 极品五月天| www.25五月婷婷| 婷婷丁香激情综合色情| 在线天堂9| 五月丁香综合中文| 五月婷婷草| www.色色com| WWW.HENHENL.| 国产伊人大香蕉| WWW.HENHENL.| 久久日韩婷婷五月| 丁香五月激情网| 99久久五月天| 在线你懂的亚洲欧| 丁香婷婷网| 自拍偷窥99热| 综合激情网五月激情| 色五月婷婷中文字幕在线观看 | 国产精品24r| 开心五月婷婷伊人| 99久久精彩视频| 精品导航在线x不卡| 五月天怕怕| 九九av在线| 欧美三级黄色片久久| 九九色院| 丁香综合网| 人妻爽爽爽久久久久久久久| 97深爱伊人综合| 五月天自拍视频| www.av骚货| 亚洲热久久| 五月婷婷六月丁香在线视频免费在线观看| 91人操| 精品久久99码| 青青草免费公开视频| 5月丁香美女影院| 变态另类色图| 日韩一级片| 热久久99视频| 天天色,天天日,天天做| 啊V视频在线观看| 亚洲综合另类| 91熟妇大香蕉| 日韩啪啪网| 六月香五月婷| 九九热视频在线观看| 色久九| 噜噜噜狠狠色综合| 婷婷五月天丁香久久| 天天搡日日搡aaaaⅩ| 超黄亚洲瑟瑟网站| 狠狠摸狠狠摸| 午夜少妇在线观看视频| 日本99视频精品免费播放| 色婷婷综合网| 久久亚洲激情五码| 69精品人人人人| 爱iii做iiii日日| 国产成人AV在线播放| 伊人网欧美在线男人天堂五月丁香| 婷婷综合成人五月天| 色五月婷婷五月天激情综合| 99精品视频网| 婷婷激情五月视频| 五月婷高清视频| 丁香五月成人社区| 8090在线影视少妇| 激情综合九月| 五月丁香亚洲婷婷| 99国产精品久久久久久久久久久| 97干婷婷| 激情综合色五月丁香六月亚洲| 婷婷五月天综合网| 亚洲精品字幕| 六月丁香婷婷综合色播| 五月婷婷九| 欧美午夜乱妇午夜福利| 久久大香蕉| 很很干夜夜干| www五月婷婷| 九九色逼| 亚洲av日韩无码| 97人碰人操| 欧美丁香婷婷天天操| 婷婷狠狠操| 热思思九九| 色八月婷婷| 91九色视频在线观看| 激情AV网| 精品婷婷五| 超碰99久久| 婷婷婷五月香蕉| 激情婷婷五月天网址| 97碰碰人人| 国产婷婷久久| 岛国AV网站| 日韩黄色影院| 五月婷婷成人网首页| 丁香六月色婷婷| 六月婷婷色色色| 日本五月天婷婷丁香| 伊人婷婷99热精品| 九九热手机在线视频| 婷婷激情六月| 精品99这里有| 久综合网| 桃色激情婷婷伊人网| AV性爱在线| 激情五婷网| 激情综合99| 任你日热视频| 9l视频自拍9l视频自拍九色学生| 67194中文字幕| 狠狠高潮精品亚洲1| www.99操| 五月丁花六月丁香综合| 97操| 手机旧版看人妻1025| 亚洲综合成人网站| 婷婷九月在线| 国产免费AV网站| 亚洲操精品| 丁香婷婷五月激情| 五月丁香五月综合欧美| av 一区三区四区| 色婷婷五月天| 天天综合五月| 色色图五月天| 一区二区免费看| 婷综合| 久久精品性爱| 狠狠干青青草| 六月丁香成人| 丁香五月激情婷婷| 色婷婷深爱五月| 夜色热久| 亚洲婷婷五月| 五月天色导航婷婷资源婷婷| 色五月激情五月| 五月婷婷免费视频| www:99热视频| 五月天婷婷视频| 婷婷五月天激情在线观看| 婷婷六月激情综合| 久久综合影院| 色婷丁香五月| 五月做爱| 另类图片天天影视在线观看| 成人色五月天| 久久日韩婷婷五月| 婷婷丁香六月| www.99色| 西西4r午夜剧场| 九九精品热| 97色在线视频| 香蕉影院色| 丁香综合婷婷五月天| 久久丁香五月综合六月激情红杏视频 | 67194中文字幕| 中文av网站| 激情婷婷丁香色五月| 激情亭亭五月| 大地9中文在线观看免费高清| 五月天,激情四射,婷婷频道| 久久亚洲婷婷| 久久婷婷五月综合色和| 99热精品在这里| 久久人妻高清中文| 国产日产成人亚洲欧美国产VA| 九九热青草| 天堂综合久| 激情五月综合六月丁香婷婷狠狠干| 久久香视频| 五月丁香综合激情| 99只有精品| 婷婷丁香一月| 九九色精品| 五月婷婷丁香综合,亚洲天堂| 婷婷五月激情五月激情| 九九热视频这里只有精品| 99热这里只有精品国产免费| 色婷六月| av一区二区电影免费在线观看| 夜夜爽天天干| 久久婷婷六月综合综合| 狠狠狠狠狠操| 婷婷五月天无码熟女| 九九综舍久久| 亚洲天堂九九九| 乱精品一区字幕二区| 成人网在线视频| 99热99热| 色五月激情综合| 无码se| 色婷婷丁香九月| 91色综合网站在线| 伊人激情AV一区二区三区| 99久在线观看| 五月丁香六月婷婷色情| 五月婷婷天| 色婷婷色久综| 色的色综合| 天天舔天天插天天爱| 99在线视频免费| 狠狠色婷婷综合开心影视| 人妻丰满精品一区二区A片| 五月婷六月| 97操在线视频| 久久久激情视频| 色五月丁香婷婷久草| 丁香六月成人| 婷婷天天日婷婷| 九九性视频| 婷婷香五月综合激情| 丁香六月婷婷综合麻豆| 五月婷婷亚洲综合网| 开心五月激情| 99热这里有精品6| 婷婷五月天激情四射五月天激情| 日本怕怕视频| 99热 免费| 九九热这里精品| 丁香丁香激情网| 丁香六月婷婷五月天| 99色这里| 精品国产人人爱人人| 五月婷婷深深爱爱| 激情五月综合色婷婷| 能看的av片| 丁香激情六月天婷婷| 五月丁香六月情婷婷久久| 色色亚卅| 人人干人人操人人摸| 五月天成人综合| 91人人操人人爱| 成人视屏在线观看| 六月丁香五月婷婷| 1024亚洲无码| 久久精品五月| 在线18av | 日本婷婷色日| 亚洲无码成人| 一二线视频 另类| 在线五月婷| 九月婷婷综合在线| 久久精品91视频| 大香蕉网站,大香蕉综合| 婷婷五月天AV网| 五月色 亚洲| 99re在线这里只有精品视频首页| 久热这里| 亚洲色综合| 91|疯狂丨高潮丨对白| 天天色五月婷婷91久久久久久久| 五月丁香六月婷婷久久肏| 丁香五月中文字幕| 五月在在观看| 天天舔天天爽| www.99在线| 婷婷亚洲在线| 日韩狠狠色| 色亭亭五月天网扯| 九九无码| 久久精品99国产精品日本| 狠狠色丁香久久综合婷婷亚洲成人福利 | 99r久久这里只有精品| 色欲午夜无码久久久久久张津瑜| 天天综合在线网| 99riav 亚洲| 欧美操逼天堂| 日韩av干| 99在线69| 亚韩精品视频1区| 香蕉婷婷色五月| 九色视频这里只有精品| 精品人妻在线| 超碰在线50| 影视av久久久噜噜噜噜噜三级| 就99这里只有精品| 丁香 亚洲 久久| 无码日本精品XXXXXXXXX | 超碰97久久| 天天碰天天插天天操| 91精品久久久久久77777| 美女久久婷婷| 婷婷激情五月天综合| 丁香五月色五月| www91色网站| 综合丁香婷婷五月天| 五月婷婷第四色| 天天做天天爱天天爽| 偷偷操99| 六月婷婷久久| 亚洲精品白浆高清久久久久久| 九热免费视频| 天天天综合网| 五月J香蕉婷婷| 五月婷婷高清| 五月天开心色情网| 国产精品视频网| 五月天婷婷乱| 免费精品99| 婷婷伊人中文字幕| 97色热| 欧美色偷偷大香| 99在线视频精品| 91久久久久久久久18| 五月丁香综合激情网| 天天干天干| 亚洲综合色婷婷文学| 久操婷婷| 色色五月婷| 9久国产| 午夜成人在线免费视频| 欧美日韩aaaa| 91在线资源| 亚洲精品性色| 牛牛澡牛牛爽| 99热777| 亚洲AV在线免费看| 69午夜成人影片| 亚洲精品久久久久AV无码| 久久66er久久| 欧美色色色| bbwcuckold精品熟妇| 丁香六月五月天| 91九九| 丁香六月色婷婷| 色综合色综合网| 99这里只有| 在线五月婷婷小电影| 色色色色色色色色综合网| 五月丁香激情综合| 免费亚洲婷婷| 狠色狠色狠狠色综合网| 国产FREESEXVIDEOS性中国| 婷婷色情五月| 狠狠色婷婷六月激情网| 国产,欧美,日韩,性爱| 丁香88AV五月婷婷| 台湾佬天天日丁香婷婷五月天| 综合天堂AV久久久久久久| 六月丁香五月激情网| ai97re99一本| 操骚货在线| 久青操| 丁香久久| 日本婷婷网| 婷婷狠狠综合网入口| 色色综合视频| www.精品久9| 久色网址| 激情五月婷婷欧美极品| 东京热五月婷婷| 色婷婷婷婷五月天| 97碰超级人人看| 99精品久久| 婷婷五月天激情影片| 久操人| 另类在线| 五月天婷婷久久综合| 婷婷久久女人| 天天激情站| www.日韩艹| www.com色播五月天| 超碰99在线| 99热综合| 五月天激情婷婷丁香| 97人人操com| 国产成人+综合亚洲+天堂| 另类婷婷丁香| 97干在线观看| 成人日韩欧美| 五月天亭亭俺也| 思思久久99热| 狠狠狠狠青草| 日韩无码成人电影| 五月婷婷激情视频| 成人操呦av| 激情五月九九九| 美女五月天| 色永久| 久久综合激情五月天| 亚洲99一级无嗎特制在线| 大香蕉综合| 婷婷五月六月激情| 亚洲综合字幕色色| 激情综合文学| 夜夜操狠狠操| 丁香五月中文字幕色播| 五月天婷婷丁香花| 久久婷婷色综合| 久久综合九色综合97婷婷| 婷婷五月激情欧美| 综合激情深爱| 凹凸7777操操操| 色婷婷激情四射视频| av在线播放网站| 九九99久久| 婷婷狠狠色| 激情纯色婷婷五月天在线不卡视频| 丁香婷婷五月色成人网站| 亚洲成人AV高清字幕| 色噜噜狠狠色综合日日| 99色精品| 婷婷色情小说| 深爱激情AV| 色色色色五月天| 97香蕉人人在线观看| 日本黄色一级| 色欲天天综合网| 99热这里只有精品1025| 99性视频| 人人干AV| 婷婷欧美色| 日韩成人中文字幕| 亚洲综合成人网站| 色天使色综合| 国产精产国品一二三在观看 | 人人草人人爱| 亚洲经典小视频| 呦呦v线| 五月天婷五月天综合网在线观| 九九99九九99九九99视频网| 亚洲色色五月| 成片免费观看大全| 国产女18毛片多18精品| 色婷婷五月天堂资源| 五月婷婷综合热| 色啪综合| 伊人久久五月天| 久久香蕉网| 淫视馆aV二区一区| 五月婷精品| 成人 视频免费观看网站| 99人人操| 91久久电影| 色欧美日| 91人人操人人看| 欧美激情久| 久青草大香蕉| 94干大香蕉| 激情五月天99色| 久久久A级视频| 综合久久久婷| 99久超碰| 婷婷综合网| 久久精品爱爱| 五月熟妇婷婷久久| 五月开心婷婷| 99热亚洲精品66| 99精品小视频| 五月婷婷影院| 中文字幕在线免费观看视频| 久热婷婷| 国产日比| 国产日产亚洲系列最新| 99在线视频观看| 国产AV熟妇人震精品一品二区| 欧美丰满熟妇BBB久久久| 搡BBBB搡BBB搡五十| http://www.com久久久精品一区| 日本韩国视频在线观看社区免费的9| 白人荫道BBWBBB大荫道| 91大屁股在线| 五月激情婷婷国产精品久久久久久| 黄色一级影片| 99五月丁香丁| 五月婷婷伊人网| 亚洲综合婷婷六月丁香五月| 婷婷丁香小说| 99久re热视频精品98| 激情五月天色播| 亚洲av另类在线观看| 五月婷婷综合影院| 超碰99热| 丁香婷停五月激情综合深爱| 99re鈥哸鈥唙| www激情| 国产欧美日韩综合精品一区二区| 免费碰碰视频久| 色欲影香| 婷婷五月天视| 99er精品视频| 久久九九网| 亚洲精品V天堂中文字幕| 国av网| 99ri精品在线| \\五月天婷婷激情| 婷婷激情图片| 青草视频在线观看视频| www.九月婷婷丁香.com| 9久精品| www久热com| 天天摸天天肏| 丁香五月婷婷色综合| 色人久夂| 婷婷五月丁香激情色情| 婷婷五月天影院| 极品少妇XXXX精品少妇偷拍| 婷婷丁香视频| 狠狠夜夜五月丁香| 综合图片色色| 欧美大片免费播放器| 在线成人视频免费| 亚洲丁香五月美女| 五月色丁香| 亚洲亚洲人成综合网络| 大香蕉久久久| 99亚洲无码| 综合久久婷婷| 婷婷综合在线播放| 狠狠色 综合色区| 天天操人人干| 五月天停婷基地| 狠狠操天天日| 色婷婷影视| 久久久久久久久久久44| 亚洲色欲欧美一区二区三区| 久久综合影院 | 五月丁香天天| 色播婷婷五月天| AV变态另类一区二区| 99热无码精品| 精品激情| 色五月婷婷1| 激情色情五月天| 九九色逼| 人人澡玖玖一| 激情婷婷五月天| 色色草97| 天天拍久久| 狠狠色色| 综合激情伊人影视在线| 日本高清久| 日本九九九九九九| 美女美女美女三级色天天天天天| 五月婷婷综合网| 激情婷婷丁香五月天小说| 色色五月天婷婷丁香| 潮汕成人AV片在线| 丁香五月激情性色郤| 91丨九色丨东北熟女| 成人片在线播放| 91丨九色丨白浆| 大香蕉Av在线| 噜噜狠狠色| 婷婷久久婷婷色五月| 天天天天做夜夜夜夜做| 国产AV一区二区三区最新精品 | 97日韩无套内| 婷婷激情综合色五月久久,色婷婷丁香花,丁香婷婷五月情天,久久婷婷五月综合色 | 激情五月丁香激情综合网| 婷婷操逼| 色综合色婷婷色伊人| 国产激情综合五月久久| 玖玖在线视频| 99热综合网| 亚洲婷婷在线播放十月| 天天干天天操天天爽| 九九国产视频| 狠狠操狠狠操AV| 亚洲视频a| 丁香六月综合激情| 天天天操天天天爰| 99在线精品免费视频| 丁香六月亚洲| 中文字幕一色哟哟哟哟| 99热只有精品在线观看| 综合狠久久| 亚洲六月色| 九九色天堂| 亚洲免费99| 久久激情综合| 丁香五月性| 日在线V视频在线播放| 在线观看免费观看在线9久| 天天综合亚洲综合| 伊人大香久久| 激情五月婷| 啪啪综合网| 99国产精品久久久久久久久久久| 久久婷婷欧美| 91av无码| 99热碰碰热| 久久色五月天| 色综合久久之分久久| 五月婷婷亞洲中文| www.99热在线| 婷婷五月天开心网| 婷婷色播综合五月| 激情婷婷。| 9久国产精品| 久久中文人妻系列| 婷婷综合九色伊人| 国产午夜精品一区二区| 人人爱操| 五月天激情美女久久| 五月婷婷六月丁香激情| 丁香五月综合婷婷| 538在线精品| 五月婷亚洲精品| 婷婷丁香在线| 国产毛片操B| 婷婷婷久久久| 婷婷五月激情六月丁香| 色激情网| 国产激情视频在线观看| 久久婷婷五月激情网站| 色香久久| 三男玩一女三A片| 欧美婷婷精品激情| 五月噜噜噜色综合| 丁香五月婷婷亚洲天堂| 激情五月天影院| 天天干天天射色综合| 亚洲综合久| 色婷插| 91精品久久久久久| 欧美综合五月丁香五月天| 色婷婷色情| 综合AV网| 99操视频| 五月天,激情四射,婷婷频道| 超碰碰碰碰| 毛片九九九九九九| 色激情五月天| 日本天天色| 久久久婷丁香五月| 精品牛仔裤超碰| 99re8热精品免费视频| 色情综合网| 激情内射p| 婷婷五月天在线综合导航| 五夜丁香| 91碰免费视频| 久碰视频| 婷婷丁香五另类网站| 99热中文字幕久久| 在线VA视频| 大香蕉五月婷婷| 婷婷五月欧美| 中文成人在线| 九九视频在线观看| 婷婷五月丁香色综合| www色中色综合| 91精品电影18T| 在线成人网址| 色婷成人狠干| 高清a片基地| 极品人妻VIDEOSSS人妻| 久久九九综合| 婷婷色操| 天天爽天天爽视频| 精品成人无码A片观看香草视频 | 国产AV一区二区三区最新精品| 97影院一级片| 99热这里只有精品在线观看| 26uuu国产精品| 亚洲综合在线视频| 大香蕉伊人爱在线| HD久久精品视频| 2025神马午夜福利| 婷婷色婷婷| 综合网激情| 久色网| 欧洲亚洲免费视频9| 五月婷婷五月天| 丁婷婷五月天在线播放| 天天干com| www.夜夜騎夜夜狠| 日日操日日射| 日韩AAA| 伊人日日干| 久久奄也去色色网站| 久久黄色免费视频| 丁香五月婷婷久久久| 99在线观看亚洲| 婷婷八月激情| 怕怕視頻| 五月天开心激情网色欲无码| 超碰在线人妻| 六月婷婷综合| 九九热a| 六月丁香婷婷综合色播| 久久久精品99亚洲综合| 五月天激情综合首页| 色婷婷婷av | 人妻中文字幕精品| 天堂久久大香蕉| 丁香五月综合首页| 国产婷婷五月天| 综合色播| 国产伊人五月天| 深爱开心激情网| 五月丁香色婷婷熟女| 五月综合缴情网| 夜夜爱网站| 丁香五月综合激情啪啪| 综合色播| 亚洲五月天激情| 久久精品99国产精品日本| 极骚大香蕉伊人| 九九色情网五月天| 92国产福利| 一区色色色色网| 在线综合婷婷| 婷婷久久草| 秋霞成人毛片一级A片| 天天日综合| 双性美人被调教到喷水A片| 久9热视频在线| 午夜丁香六月婷| 九九色逼| 79成人网| 人人播| 激情五月天色色| 亚洲精品V天堂中文字幕| 天天射天天操天天干| 冬月かえでAV无码播放| 99热啪啪| 天天天天天操| 久久免费婷婷视频| 久热 91| 九九99久久| 欧美人人草草| 久久九九玖玖| 就爱啪啪婷婷| 日婷婷| 五月丁香六月激情| 欧美,日韩成人在线| 99精品视频偷拍| 色播五月丁香婷婷| 丁香五月天啪啪| 97干在线视频| 人人操碰| 久久这里这里有精品免费视频| 婷激情五月| 99在线视频精品| 色色网站毛片| 亚洲无线视频| 99在线视频精品| 一区二区免费看| av操逼网| av在线资源| 伊人啪啪网| 91久久婷婷| 99久久.www| 天干干夜夜操| www.97碰碰com| 四季8848精品成人免费网站| 婷婷娌伦网| 日日干日日s| 色99日韩| 久久丁香综合精品综合| 永久的网站AAAA| 丁香婷婷六月| 香蕉97碰碰碰欧美| 久操人妻| 丁香五月婷婷在线观看| 97综合在线| 99男人天堂| 丁香五月五婷| 99精品网| www色五月| 丁香六月欧美| 国产在线网| 久久精品色| www.天天干| 丁香花综合永久入口| 国产永久一二一起草| 超碰色综合| 色婷婷综合在线| 小视频一区| 九九色综合| 天天爱天天做天天日| 少妇人妻人伦A片| 五月天天综合网色婷婷| 亚洲综合网激情小说| 99热这里只有精品2| 国产精品色婷婷久久久精品| 婷婷五月天资源| 亚洲成av人影院| 日韩色色网| 九九激情综合| 日韩欧美成人片| 亚洲最大视频| 婷婷黄色网| www.五月婷婷久久.com| 久久久久久人妻| 超碰在线成人| 九九热中文| 91碰超| 99啪啪网| 精品人妻在线| 天天做好综合色| 91操女| www.99成人视频| 超碰熟女农村在线69| 色情五月天首页| 欧美顶级少妇做爰HD| 激情五月天啪啪视频| 色99视频| 国产精品久久99| a久久| 九九热10| 五月天久久久| 天天做天天爱天天日| 五月天婷婷色综合| 久久女婷| 99久久综合网| 色五月丁香总合网| 色综合五月天| 五月丁香久久综合精品| 国产肥白大熟妇BBBB视频| 五月丁香亚洲五月| 精品成人在线| 婷婷丁香综合成人| 碰碰碰碰碰99| 天天摸天天舔天天天天爽| 老妇操B| 国产免费AV网站|