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

ARTICLE DETAIL

資訊詳情

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

Flask與Django雙框架協(xié)作:校園閑置物品換購(gòu)平臺(tái)實(shí)戰(zhàn)詳解

Flask與Django雙框架協(xié)作:校園閑置物品換購(gòu)平臺(tái)實(shí)戰(zhàn)詳解 看到基于flask-django這種題目的時(shí)候不少同學(xué)第一反應(yīng)是:這倆框架是不是得二選一?或者怕寫(xiě)成用Django做了個(gè)主頁(yè)、用Flask做了個(gè)登錄頁(yè)的縫合怪。其實(shí)這類(lèi)設(shè)計(jì)題目真正想考察的是你能不能理解兩個(gè)Web框架各自的能力邊界并且用一套合理的架構(gòu)讓它們協(xié)作完成一個(gè)完整業(yè)務(wù)。這個(gè)校園個(gè)人閑置物品換購(gòu)平臺(tái)我當(dāng)初從需求分析到部署上線完整走了一遍坑踩了不少但做完之后對(duì)Python Web開(kāi)發(fā)的理解確實(shí)上了一個(gè)臺(tái)階。這篇文章我會(huì)把整套設(shè)計(jì)思路、核心數(shù)據(jù)表結(jié)構(gòu)、雙框架協(xié)作方式、關(guān)鍵代碼實(shí)現(xiàn)以及部署階段遇到的真實(shí)問(wèn)題全部梳理出來(lái)。不管你是要做課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)還是單純想練手兩個(gè)主流Python框架這篇都值得看完。1. 雙框架并存的核心思路:主業(yè)務(wù)收斂、輔助功能外放先直接說(shuō)結(jié)論:一個(gè)項(xiàng)目里同時(shí)出現(xiàn)Flask和Django絕不是讓它們做重復(fù)的事而是讓每個(gè)框架去做自己最擅長(zhǎng)的事。1.1 Django和Flask的能力邊界Django自帶ORM、Admin后臺(tái)、用戶(hù)認(rèn)證體系、表單處理、CSRF防護(hù)這種全家桶特性非常適合承載業(yè)務(wù)主鏈路。對(duì)于校園閑置物品換購(gòu)平臺(tái)來(lái)說(shuō)用戶(hù)注冊(cè)登錄、物品發(fā)布、訂單交易、后臺(tái)審核這些核心模塊用Django來(lái)做能省掉大量重復(fù)造輪子的工作而且數(shù)據(jù)模型和數(shù)據(jù)庫(kù)遷移都通過(guò)Django ORM統(tǒng)一管理代碼維護(hù)成本低。Flask則是一個(gè)輕量級(jí)框架它不替你做任何決定但勝在靈活、啟動(dòng)快、寫(xiě)小服務(wù)非常順手。在這個(gè)項(xiàng)目里我把推薦接口、數(shù)據(jù)統(tǒng)計(jì)聚合、圖片壓縮處理這類(lèi)相對(duì)獨(dú)立的輔助功能放到了Flask側(cè)。這類(lèi)功能的特點(diǎn)是:邏輯相對(duì)獨(dú)立、調(diào)用頻率可能很高、不影響主交易流程即使某個(gè)接口掛了也不能拖垮用戶(hù)下單。1.2 雙框架協(xié)作的三種常見(jiàn)模式我見(jiàn)過(guò)不少團(tuán)隊(duì)做這類(lèi)雙框架項(xiàng)目拆法大致有三種:協(xié)作模式實(shí)現(xiàn)方式適用場(chǎng)景優(yōu)缺點(diǎn)方式A:共享數(shù)據(jù)庫(kù)獨(dú)立服務(wù)Django跑主站Flask跑API子服務(wù)兩者連同一個(gè)MySQL通過(guò)HTTP接口互相調(diào)用課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)也是本文采用的方案架構(gòu)清晰、容易演示但要注意兩個(gè)框架訪問(wèn)同一批表時(shí)的模型一致性問(wèn)題方式B:主進(jìn)程嵌入用werkzeug的DispatcherMiddleware把Flask應(yīng)用作為Django的子應(yīng)用掛載只想演示同時(shí)使用了兩個(gè)框架時(shí)用來(lái)交差部署簡(jiǎn)單但兩個(gè)框架的session、中間件會(huì)互相干擾后期難維護(hù)方式C:完全微服務(wù)化各自獨(dú)立數(shù)據(jù)庫(kù)通過(guò)REST API松耦合通信分布式結(jié)課項(xiàng)目演示效果好但數(shù)據(jù)一致性難保證工作量也大我最終選了方式A。理由很現(xiàn)實(shí):課程設(shè)計(jì)和畢設(shè)的評(píng)審老師最看重的是業(yè)務(wù)閉環(huán)也就是用戶(hù)能發(fā)布物品、能下單、能完成換購(gòu)。共享一個(gè)MySQL能保證交易的強(qiáng)一致性Flask只負(fù)責(zé)讀多寫(xiě)少的輔助接口就算Flask掛了Django站點(diǎn)的核心功能也不受影響。這其實(shí)是真實(shí)企業(yè)里主業(yè)務(wù)收斂、輔助功能外放思想的一個(gè)簡(jiǎn)化版答辯的時(shí)候這樣講非常加分。1.3 為什么推薦先設(shè)計(jì)架構(gòu)而不是先寫(xiě)代碼很多同學(xué)拿到題目第一件事就是django-admin startproject然后就開(kāi)始寫(xiě)models。我的建議是反過(guò)來(lái)先花半天時(shí)間把這個(gè)平臺(tái)到底有哪些角色、哪些核心流程、哪些狀態(tài)想清楚。你可以問(wèn)自己三個(gè)問(wèn)題:誰(shuí)是系統(tǒng)用戶(hù)?學(xué)生、管理員還可能有什么?最核心的流程是什么?發(fā)布物品、發(fā)起換購(gòu)、確認(rèn)交換、互相評(píng)價(jià)。哪些功能寫(xiě)進(jìn)Django哪些拆給Flask?根據(jù)依賴(lài)關(guān)系劃分而不是按頁(yè)面劃分。想清楚這三個(gè)問(wèn)題后面寫(xiě)代碼就是照?qǐng)D施工而不是邊寫(xiě)邊改。這個(gè)項(xiàng)目里我最深刻的體會(huì)就是:前期架構(gòu)多花的時(shí)間后期至少能省三倍。2. 校園換購(gòu)平臺(tái)的需求本質(zhì):不是簡(jiǎn)單二手交易閑置物品換購(gòu)聽(tīng)起來(lái)和閑魚(yú)、轉(zhuǎn)轉(zhuǎn)差不多但落在校園場(chǎng)景里需求邏輯其實(shí)有明顯區(qū)別。搞清楚這些數(shù)據(jù)庫(kù)表設(shè)計(jì)才有的放矢。2.1 校園場(chǎng)景的三個(gè)核心差異第一,用戶(hù)身份天然可信。注冊(cè)必須綁定學(xué)校域名郵箱或?qū)W號(hào)這意味著平臺(tái)內(nèi)交易雙方的違約成本更高不需要像閑魚(yú)那樣做復(fù)雜的芝麻信用體系。第二,交易以線下自提為主。大學(xué)生活動(dòng)范圍高度集中宿舍區(qū)、教學(xué)樓、食堂就是天然的交貨點(diǎn)。所以系統(tǒng)不需要物流模塊但要記錄交易地點(diǎn)偏好比如只限本校圖書(shū)館自提。第三,換購(gòu)包含了物物交換和補(bǔ)差價(jià)。這是這個(gè)項(xiàng)目和普通二手交易平臺(tái)最大的區(qū)別。用戶(hù)發(fā)布物品時(shí)除了標(biāo)價(jià)還可以寫(xiě)明想交換什么比如用一臺(tái)Kindle換一副降噪耳機(jī)可以補(bǔ)差價(jià)50元。這意味著訂單表的設(shè)計(jì)不能只有買(mǎi)家、賣(mài)家、金額三個(gè)字段。2.2 核心角色與功能邊界我把系統(tǒng)拆成前臺(tái)、后臺(tái)、輔助服務(wù)三塊:角色核心功能所屬框架普通學(xué)生注冊(cè)登錄、瀏覽物品、發(fā)布閑置、發(fā)起換購(gòu)、留言詢(xún)問(wèn)、確認(rèn)收貨、評(píng)價(jià)Django系統(tǒng)管理員審核物品、處理舉報(bào)、用戶(hù)封禁、數(shù)據(jù)統(tǒng)計(jì)Django Admin Flask統(tǒng)計(jì)接口輔助服務(wù)物品推薦、瀏覽量統(tǒng)計(jì)、圖片壓縮、Excel導(dǎo)出Flask功能邊界定了之后頁(yè)面結(jié)構(gòu)就清楚了。前臺(tái)總共沒(méi)幾個(gè)頁(yè)面:首頁(yè)(物品流)、物品詳情、發(fā)布頁(yè)、個(gè)人中心、訂單列表、站內(nèi)信。管理后臺(tái)直接用Django Admin改一改就夠用不需要額外寫(xiě)。2.3 交易狀態(tài)機(jī):整個(gè)業(yè)務(wù)最核心的部分換購(gòu)流程不是簡(jiǎn)單的下單-付款-發(fā)貨-收貨因?yàn)榇嬖陔p方交換物品的情況狀態(tài)機(jī)必須多幾條分支。我自己項(xiàng)目里的狀態(tài)流轉(zhuǎn)是這樣設(shè)計(jì)的:用戶(hù)A發(fā)布物品X,狀態(tài)為在售。用戶(hù)B發(fā)起購(gòu)買(mǎi)或換購(gòu)請(qǐng)求物品X變?yōu)榻灰字型瑫r(shí)生成一條訂單記錄。雙方約定時(shí)間地點(diǎn)線下驗(yàn)貨。雙方都在系統(tǒng)中點(diǎn)擊確認(rèn)交換或確認(rèn)收貨訂單變?yōu)橐淹瓿?。如果任何一方在交易中超時(shí)未確認(rèn)可以申請(qǐng)取消訂單變?yōu)橐讶∠锲稾自動(dòng)回到在售。單獨(dú)把換購(gòu)拎出來(lái)說(shuō):當(dāng)B提出我想用物品Y換你的X時(shí)系統(tǒng)要同時(shí)鎖定X和Y兩件物品直到雙方確認(rèn)完成或者取消。這個(gè)雙向鎖定邏輯容易漏寫(xiě)業(yè)務(wù)代碼里一定要同時(shí)處理兩個(gè)物品的狀態(tài)。3. 數(shù)據(jù)庫(kù)設(shè)計(jì):換購(gòu)業(yè)務(wù)的核心表長(zhǎng)什么樣選型上我用了MySQL 8.0原因無(wú)他校園網(wǎng)環(huán)境里MySQL最通用后面查資料、找問(wèn)題都容易。Django側(cè)用ORM管理表結(jié)構(gòu)Flask側(cè)通過(guò)SQLAlchemy讀取同一批表。3.1 用戶(hù)表與擴(kuò)展資料表Django自帶的auth_user不要直接改而是建一張profile表一對(duì)一關(guān)聯(lián)。需要存的就是學(xué)號(hào)、學(xué)校郵箱、宿舍區(qū)域、信用分、頭像路徑。class Profile(models.Model): user models.OneToOneField(User, on_deletemodels.CASCADE, related_nameprofile) student_id models.CharField(max_length20, uniqueTrue, verbose_name學(xué)號(hào)) campus_email models.EmailField(uniqueTrue, verbose_name校園郵箱) dorm_area models.CharField(max_length50, blankTrue, verbose_name宿舍區(qū)域) credit_score models.IntegerField(default100, verbose_name信用分) avatar models.ImageField(upload_toavatars/, blankTrue)為什么不直接在User上加字段?因?yàn)镈jango的User模型被Admin、認(rèn)證、session到處引用直接改字典字段容易在后續(xù)升級(jí)或第三方庫(kù)適配時(shí)報(bào)錯(cuò)。一對(duì)一的Profile幾乎是所有Django項(xiàng)目的標(biāo)準(zhǔn)做法。3.2 物品表:狀態(tài)和換購(gòu)意向是靈魂物品表是整個(gè)平臺(tái)的流量核心字段設(shè)計(jì)直接影響后續(xù)的檢索和交易。class Item(models.Model): STATUS_CHOICES [ (on_sale, 在售), (trading, 交易中), (sold, 已售出), (off_shelf, 已下架), ] title models.CharField(max_length100) category models.ForeignKey(Category, on_deletemodels.SET_NULL, nullTrue) description models.TextField() price models.DecimalField(max_digits8, decimal_places2) want_exchange models.CharField(max_length200, blankTrue, verbose_name想換的物品) condition_level models.IntegerField(choices[(i, f{i}成新) for i in range(1, 11)]) image models.ImageField(upload_toitems/) owner models.ForeignKey(User, on_deletemodels.CASCADE, related_nameitems) status models.CharField(max_length20, choicesSTATUS_CHOICES, defaulton_sale) view_count models.IntegerField(default0) created_at models.DateTimeField(auto_now_addTrue)這里有一個(gè)值得說(shuō)的細(xì)節(jié):condition_level我用了0到10的成新度而不是幾乎全新/輕微使用痕跡這樣的模糊描述。原因很簡(jiǎn)單:成新度便于后期用SQL做排序和篩選比如只看九成新以上的物品文本字段就沒(méi)法高效查。3.3 訂單表:換購(gòu)和購(gòu)買(mǎi)共用一張表我見(jiàn)過(guò)很多項(xiàng)目把購(gòu)買(mǎi)訂單和換購(gòu)訂單分成兩張表,這是個(gè)坑。因?yàn)閾Q購(gòu)本質(zhì)上就是雙方互為買(mǎi)家和賣(mài)家的交易拆成兩張表后查詢(xún)我參與過(guò)的所有交易就變得非常痛苦。正確的做法是用一張order表通過(guò)判斷exchange_item字段是否為空來(lái)區(qū)分交易類(lèi)型:字段類(lèi)型說(shuō)明id主鍵訂單號(hào)itemFK主物品buyerFK發(fā)起交易的人sellerFK物品發(fā)布者exchange_itemFK可空若為換購(gòu)則指向買(mǎi)家提供的物品priceDecimal成交價(jià)或補(bǔ)差價(jià)statusCharFieldpending / confirmed / completed / cancelledcreated_at / updated_atDateTime記錄時(shí)間關(guān)鍵邏輯是:如果exchange_item不為空那么這筆訂單成交時(shí)buyer的exchange_item狀態(tài)必須變?yōu)閟old同時(shí)item狀態(tài)變?yōu)閟old。這兩個(gè)更新必須放在同一個(gè)數(shù)據(jù)庫(kù)事務(wù)里否則會(huì)出現(xiàn)A以為換成功了、B的物品還掛著賣(mài)的數(shù)據(jù)錯(cuò)亂。3.4 留言、舉報(bào)、評(píng)價(jià)表這三張表結(jié)構(gòu)都比較簡(jiǎn)單。留言表關(guān)聯(lián)物品和用戶(hù);舉報(bào)表關(guān)聯(lián)被舉報(bào)的物品或留言;評(píng)價(jià)表關(guān)聯(lián)訂單買(mǎi)家和賣(mài)家各自只能評(píng)價(jià)一次用order_id reviewer_id做聯(lián)合唯一約束。這些都屬于快速迭代的表先建起來(lái)后續(xù)有需求再加字段就行。數(shù)據(jù)庫(kù)設(shè)計(jì)這塊我的實(shí)際經(jīng)驗(yàn)是:不要想著一步到位建出完美表結(jié)構(gòu)先讓核心交易閉環(huán)跑通再根據(jù)實(shí)際頁(yè)面反饋補(bǔ)索引和字段。這個(gè)項(xiàng)目里我最開(kāi)始沒(méi)給item.status加索引結(jié)果數(shù)據(jù)量到幾千條時(shí)首頁(yè)查詢(xún)明顯變慢后來(lái)才補(bǔ)上。對(duì)課程設(shè)計(jì)級(jí)別的數(shù)據(jù)量來(lái)說(shuō)這一步不做也沒(méi)事但知道了對(duì)答辯有好處。4. Django主站:從注冊(cè)登錄到訂單流轉(zhuǎn)的實(shí)現(xiàn)Django側(cè)承載了平臺(tái)的全部寫(xiě)操作我按用戶(hù)-物品-訂單-后臺(tái)四條線來(lái)講。4.1 校園身份驗(yàn)證:注冊(cè)時(shí)攔截非校園郵箱校園平臺(tái)最大的特色是身份可信所以注冊(cè)環(huán)節(jié)要攔住校外人。實(shí)現(xiàn)方式就是在UserCreationForm的子類(lèi)里重寫(xiě)clean_email強(qiáng)制郵箱后綴為學(xué)校域名。class CampusUserCreationForm(UserCreationForm): email forms.EmailField(requiredTrue) def clean_email(self): email self.cleaned_data[email].lower() if not email.endswith(your-university.edu.cn): raise forms.ValidationError(請(qǐng)使用校園郵箱注冊(cè)) return email這里的your-university.edu.cn替換成你自己的學(xué)校域名即可。另一個(gè)可選的驗(yàn)證是讓用戶(hù)填學(xué)號(hào)再和管理員維護(hù)的學(xué)號(hào)表比對(duì)不過(guò)課程設(shè)計(jì)階段用郵箱后綴就夠用了。4.2 物品發(fā)布的圖片處理物品發(fā)布頁(yè)用ModelForm綁定Item模型圖片上傳這塊有幾個(gè)容易踩的坑。第一個(gè)是默認(rèn)的ImageField一次只支持一張圖想支持多圖就得建一個(gè)ItemImage子表;第二個(gè)是用戶(hù)上傳的原圖動(dòng)輒幾兆直接存服務(wù)器既浪費(fèi)空間又拖慢頁(yè)面加載。我的做法是在保存時(shí)用Pillow把圖片壓縮兩份:一份是列表頁(yè)用的縮略圖(例如400x300裁剪)一份是詳情頁(yè)用的原圖(限制最大邊1600px)。上傳邏輯寫(xiě)在form.save()里重寫(xiě):def save(self, commitTrue): item super().save(commitFalse) if self.cleaned_data.get(image): img Image.open(self.cleaned_data[image]) img.thumbnail((1600, 1600)) # 壓縮后保存到 MEDIA_ROOT并重新賦值路徑 if commit: item.save() return item這段代碼的核心意圖是:不要在模板里做任何圖片縮放全部在服務(wù)端生成好物理文件。Django模板層雖然也能做縮略圖但那是在每次請(qǐng)求時(shí)動(dòng)態(tài)處理的高并發(fā)下CPU直接被打滿(mǎn)。4.3 訂單狀態(tài)機(jī)的事務(wù)控制當(dāng)用戶(hù)B對(duì)物品X發(fā)起換購(gòu)時(shí)要同時(shí)做三件事:創(chuàng)建訂單、把X的狀態(tài)改為交易中、把B的物品Y的狀態(tài)也改為交易中。這三個(gè)寫(xiě)操作必須在一個(gè)原子事務(wù)里用Django的transaction.atomic包起來(lái)。from django.db import transaction transaction.atomic def create_exchange_order(item_x, item_y, buyer, price_diff): order Order.objects.create( itemitem_x, exchange_itemitem_y, buyerbuyer, selleritem_x.owner, priceprice_diff, statuspending, ) item_x.status trading item_x.save() item_y.status trading item_y.save() return order是否要用select_for_update()加行鎖?如果只是課程設(shè)計(jì)數(shù)據(jù)量小、并發(fā)低不加也能跑。但如果你在答辯時(shí)想展示自己對(duì)并發(fā)問(wèn)題的理解這是絕佳素材。select_for_update()會(huì)在數(shù)據(jù)庫(kù)層面鎖定這兩件物品的行防止兩個(gè)用戶(hù)同時(shí)發(fā)起換購(gòu)導(dǎo)致?tīng)顟B(tài)錯(cuò)亂。item_x Item.objects.select_for_update().get(pkitem_x_pk) item_y Item.objects.select_for_update().get(pkitem_y_pk)這里要提醒一句:select_for_update()必須在事務(wù)內(nèi)使用也就是說(shuō)調(diào)用這個(gè)查詢(xún)的函數(shù)要被transaction.atomic包裹否則鎖會(huì)在查詢(xún)后立刻釋放起不到作用。4.4 用Django Admin做管理后臺(tái)管理后臺(tái)我?guī)缀鯖](méi)有額外寫(xiě)頁(yè)面全部靠Django Admin定制。核心配置就是把Item、Order、Report注冊(cè)進(jìn)去并定制列表展示字段:admin.register(Item) class ItemAdmin(admin.ModelAdmin): list_display (title, owner, price, status, created_at) list_filter (status, category) search_fields (title, owner__username) actions [force_off_shelf] admin.action(description強(qiáng)制下架選中物品) def force_off_shelf(self, request, queryset): queryset.update(statusoff_shelf)actions自定義操作在處理舉報(bào)時(shí)非常管用:管理員在舉報(bào)列表里看到被舉報(bào)物品勾選、下拉選擇強(qiáng)制下架、執(zhí)行三步搞定。不需要寫(xiě)任何前端代碼。5. Flask輔助服務(wù):推薦接口和統(tǒng)計(jì)看板怎么落地Django把主要業(yè)務(wù)包圓了那Flask在項(xiàng)目里到底干什么?我這邊定了兩個(gè)明確的活:推薦接口和統(tǒng)計(jì)看板。這兩塊邏輯簡(jiǎn)單、讀多寫(xiě)少、和主流程解耦非常適合用Flask起一個(gè)輕量服務(wù)。5.1 Flask推薦接口:基于瀏覽記錄的簡(jiǎn)單協(xié)同過(guò)濾推薦這塊不用整復(fù)雜的機(jī)器學(xué)習(xí)模型課程設(shè)計(jì)階段做看過(guò)這個(gè)物品的人還在看同類(lèi)物品就夠了。算法原理很簡(jiǎn)單:根據(jù)用戶(hù)在ItemViewLog表里的瀏覽記錄找出瀏覽過(guò)當(dāng)前物品的所有用戶(hù);再查這些用戶(hù)還瀏覽過(guò)哪些同分類(lèi)的物品;按出現(xiàn)次數(shù)倒序取前6個(gè)排除用戶(hù)已擁有的物品。app.route(/api/recommend/int:item_id) def recommend(item_id): item db.session.get(Item, item_id) viewers [v.user_id for v in db.session.query(ItemViewLog).filter_by(item_iditem_id)] candidates {} for uid in viewers: for vlog in db.session.query(ItemViewLog).filter_by(user_iduid).all(): if vlog.item_id ! item_id: candidates[vlog.item_id] candidates.get(vlog.item_id, 0) 1 ranked sorted(candidates.items(), keylambda x: x[1], reverseTrue)[:6] return jsonify([{item_id: k} for k, _ in ranked])這段代碼本身沒(méi)什么技術(shù)含量但它在架構(gòu)上定義了Flask負(fù)責(zé)計(jì)算、Django負(fù)責(zé)展示的協(xié)作模式。前端頁(yè)面通過(guò)fetch(/api/recommend/3)拿到推薦列表再渲染物品卡片主站代碼保持干凈。5.2 統(tǒng)計(jì)看板:給管理員看的輕量報(bào)表第二個(gè)Flask接口是統(tǒng)計(jì)看板。我需要幾組數(shù)據(jù):每日發(fā)布物品數(shù)、當(dāng)前在售物品分類(lèi)占比、熱門(mén)物品Top10。直接在Flask里用SQLAlchemy聚合查詢(xún)?nèi)缓蠓祷豃SON前端用Chart.js渲染圖表。app.route(/api/stats/category) def stats_category(): rows db.session.query(Item.category_id, func.count(Item.id)).group_by(Item.category_id).all() return jsonify([{category_id: cid, count: cnt} for cid, cnt in rows])這個(gè)統(tǒng)計(jì)接口如果也塞進(jìn)Django里代碼量和路由復(fù)雜度都會(huì)增加。放在Flask這邊整個(gè)Django項(xiàng)目只需要在Admin后臺(tái)里嵌一個(gè)iframe或?qū)懸粋€(gè)fetch調(diào)用就能展示圖表。5.3 雙框架共享同一個(gè)MySQL的模型一致性問(wèn)題這是整個(gè)項(xiàng)目里最隱蔽的坑。Django的ORM會(huì)自動(dòng)給模型加字段和約束比如多對(duì)多關(guān)系會(huì)生成中間表在某些情況下還有局部索引。Flask的SQLAlchemy模型是從零手工寫(xiě)的兩邊字段定義稍有出入查詢(xún)結(jié)果就可能出問(wèn)題輕則查不到數(shù)據(jù)重則SQLalchemy報(bào)字段不存在。我的經(jīng)驗(yàn)是:以Django的模型為準(zhǔn)Flask側(cè)只做只讀查詢(xún)的模型定義字段精簡(jiǎn)到只定義要用到的部分并且不允許Flask側(cè)做任何寫(xiě)操作。比如Item表在Flask側(cè)只需要定義id、title、category_id、price、status、view_count這幾個(gè)字段因?yàn)橥扑]和統(tǒng)計(jì)只用到這些。這樣兩邊模型的字段交集很小出錯(cuò)的概率就低。還有一個(gè)細(xì)節(jié):created_at字段在Flasks側(cè)定義時(shí)必須加上timezoneTrue否則查出來(lái)的時(shí)間會(huì)比實(shí)際時(shí)間慢8小時(shí)。這個(gè)問(wèn)題我排查了很久最后發(fā)現(xiàn)是Django啟用了USE_TZTrueMySQL里存的是UTC時(shí)間SQLAlchemy默認(rèn)按本地時(shí)間解析兩邊時(shí)區(qū)沒(méi)有對(duì)齊。5.4 Flask服務(wù)的獨(dú)立部署Flask服務(wù)最終是作為一個(gè)獨(dú)立進(jìn)程跑的。開(kāi)發(fā)環(huán)境直接python app.py就行部署時(shí)我用Gunicorn來(lái)啟動(dòng)和Django那邊的uWSGI區(qū)分開(kāi)。這樣兩個(gè)服務(wù)互不干擾Flask掛了重啟FlaskDjango掛了重啟Django。gunicorn -w 2 -b 127.0.0.1:5001 app:app日志單獨(dú)寫(xiě)到flask_app.log方便排查問(wèn)題。6. 開(kāi)發(fā)到部署階段的真實(shí)踩坑清單這部分是全文含金量最高的地方。以下每一條我都實(shí)際遇到過(guò)不給結(jié)論直接給排查思路。6.1 Python版本和Django版本之間的兼容性先檢查服務(wù)器上的Python版本再選Django版本。Django 4.2要求Python 3.10以上如果服務(wù)器是3.8裝新版Django直接報(bào)語(yǔ)法錯(cuò)誤。我一開(kāi)始在本地Windows上用Python 3.12開(kāi)發(fā)一切正常部署到Linux服務(wù)器發(fā)現(xiàn)系統(tǒng)自帶的Python是3.8最后鎖定方案是Django 4.1.7 Flask 2.3兼容性最穩(wěn)。提示:做項(xiàng)目前先確定團(tuán)隊(duì)或?qū)嶒?yàn)室服務(wù)器的Python版本python3 --version一看便知不要想當(dāng)然裝最新版。6.2 Pillow擴(kuò)展庫(kù)裝不上的問(wèn)題圖片處理依賴(lài)Pillow在純凈系統(tǒng)上經(jīng)常裝失敗。報(bào)錯(cuò)信息通常是RequiredDependencyException: zlib或者jpeg。原因很直白:系統(tǒng)缺底層圖片庫(kù)。解決方式:# Ubuntu/Debian sudo apt-get install libjpeg-dev zlib1g-dev pip install Pillow6.3 圖片上傳后頁(yè)面404本地開(kāi)發(fā)時(shí)MEDIA_URL和MEDIA_ROOT配置正確圖片能顯示。部署到Nginx后所有圖片路徑全部404。原因是Django本身不提供靜態(tài)文件服務(wù)Nginx需要把包括/media/和/static/在內(nèi)的路徑直接代理到服務(wù)器的物理目錄。Nginx配置里加一段:location /media/ { alias /var/www/project/media/; }這個(gè)坑幾乎人人都會(huì)踩因?yàn)檫@屬于Nginx配置不屬于Django代碼教程里很少寫(xiě)清楚。6.4 表結(jié)構(gòu)改來(lái)改去的遷移災(zāi)難開(kāi)發(fā)過(guò)程中我多次修改Item模型導(dǎo)致遷移文件堆積數(shù)據(jù)庫(kù)狀態(tài)和模型不同步的怪問(wèn)題時(shí)有出現(xiàn)。后來(lái)養(yǎng)成一個(gè)習(xí)慣:每次改模型前先python manage.py makemigrations --dry-run看看即將生成的遷移操作是否符合預(yù)期再真正執(zhí)行。如果已經(jīng)亂套了怎么辦?我的經(jīng)驗(yàn)是別硬修遷移文件直接重置:python manage.py migrate app_name zero python manage.py makemigrations python manage.py migrate但前提是能接受清空該app的數(shù)據(jù)。開(kāi)發(fā)階段無(wú)所謂如果是接近答辯的數(shù)據(jù),就不要這么干。6.5 換購(gòu)并發(fā)導(dǎo)致的狀態(tài)錯(cuò)亂有次測(cè)試時(shí)發(fā)現(xiàn),兩個(gè)同學(xué)同時(shí)點(diǎn)擊換購(gòu)按鈕,同一件物品生成了兩筆訂單。原因就是查詢(xún)物品狀態(tài)和創(chuàng)建訂單不在一個(gè)事務(wù)里,也沒(méi)有加行鎖。修復(fù)方案前面已經(jīng)說(shuō)了:select_for_update()加transaction.atomic。這是一個(gè)非常好的答辯回答題目,面試官問(wèn)到如何防止超賣(mài)時(shí),你拿這個(gè)項(xiàng)目里真實(shí)修過(guò)的bug舉例,說(shuō)服力遠(yuǎn)超背書(shū)。6.6 Django時(shí)區(qū)與MySQL時(shí)區(qū)不一致前面提到Flask側(cè)查時(shí)間差8小時(shí),其實(shí)Django側(cè)也遇到過(guò)。解決方案是:# settings.py USE_TZ True TIME_ZONE Asia/Shanghai這樣Django在讀寫(xiě)MySQL時(shí)會(huì)自動(dòng)把UTC時(shí)間轉(zhuǎn)換為東八區(qū)。Flask側(cè)則是手動(dòng)datetime.now(timezone.utc)或者直接查詢(xún)時(shí)加上convert_tz。6.7 雙服務(wù)部署時(shí)Nginx的upstream配置兩個(gè)服務(wù)同時(shí)跑,前端要同時(shí)訪問(wèn)Django的/路徑和Flask的/api/路徑,靠Nginx路由區(qū)分:upstream django_backend { server 127.0.0.1:8000; } upstream flask_backend { server 127.0.0.1:5001; } server { listen 80; server_name your-domain.com; location /api/ { proxy_pass http://flask_backend; } location / { proxy_pass http://django_backend; } }這樣一個(gè)域名同時(shí)跑兩個(gè)Python Web應(yīng)用,演示的時(shí)候不用來(lái)回切換端口,交互體驗(yàn)也自然。6.8 頁(yè)面模板和靜態(tài)資源的重復(fù)加載最后是一個(gè)容易被忽略的性能問(wèn)題。Django的模板是每次請(qǐng)求都渲染一遍,如果有高頻頁(yè)面(比如首頁(yè)物品流),建議加一層緩存。最簡(jiǎn)單的做法是Django的cache_page裝飾器緩存首頁(yè)60秒:from django.views.decorators.cache import cache_page urlpatterns [ path(, cache_page(60)(views.index), nameindex), ]加完緩存后,首頁(yè)壓力大幅下降,Flask推薦接口那邊也輕松不少。7. 答辯演示和后續(xù)擴(kuò)展的建議做完項(xiàng)目到真正演示還有一段距離。我見(jiàn)過(guò)實(shí)力不錯(cuò)但演示翻車(chē)的,也見(jiàn)過(guò)功能一般但演示節(jié)奏極好的?;趯?shí)際經(jīng)驗(yàn)分享幾點(diǎn)。7.1 演示前準(zhǔn)備好種子數(shù)據(jù)和錄屏不要現(xiàn)場(chǎng)發(fā)布物品、現(xiàn)場(chǎng)拍圖。提前把一個(gè)品類(lèi)下放滿(mǎn)十幾件物品,圖片用真實(shí)拍的照片而非占位圖,這樣評(píng)委打開(kāi)首頁(yè)時(shí)視覺(jué)效果好很多。同理,推薦接口的演示也別用空數(shù)據(jù)庫(kù)去測(cè),先在ItemViewLog里造好一批瀏覽記錄,否則推薦結(jié)果永遠(yuǎn)為空。錄屏軟件開(kāi)好,萬(wàn)一現(xiàn)場(chǎng)網(wǎng)絡(luò)不穩(wěn)定或者服務(wù)沒(méi)起來(lái),放錄屏照樣能講完。7.2 講清楚框架邊界比講功能更重要答辯時(shí)評(píng)委最常問(wèn)的就是:你為什么要用Flask,Django不能做推薦接口嗎? 這時(shí)候你把第1節(jié)的架構(gòu)圖往白板上一畫(huà),說(shuō)明寫(xiě)操作集中在Django、讀密集的輔助服務(wù)放Flask、共享數(shù)據(jù)庫(kù)保證一致性,評(píng)委立刻知道你理解架構(gòu)設(shè)計(jì),而不是只會(huì)堆功能。7.3 后續(xù)可以擴(kuò)展的三個(gè)方向這個(gè)項(xiàng)目做完后,想進(jìn)一步延伸可以考慮三條線:給物品加全文搜索,用Django的SearchVector或者接入Elasticsearch,解決物品多了之后分類(lèi)篩選不好用的問(wèn)題;把推薦服務(wù)升級(jí)成基于用戶(hù)行為排序的算法,比如根據(jù)分類(lèi)偏好加權(quán),不改變架構(gòu),只改Flask側(cè)的計(jì)算邏輯;加Redis緩存熱點(diǎn)數(shù)據(jù),首頁(yè)物品流和推薦結(jié)果都緩存到Redis,進(jìn)一步減輕數(shù)據(jù)庫(kù)壓力。我自己做這個(gè)項(xiàng)目的最大體會(huì)是:技術(shù)難點(diǎn)不在某個(gè)框架的API上,而在如何讓兩個(gè)框架各司其職、協(xié)同不打架。把這個(gè)問(wèn)題想透,你就能從跟著教程敲代碼進(jìn)階到真正理解Web應(yīng)用怎么搭。希望這篇能幫你少走幾個(gè)彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
夜夜爽天天干| 亭亭丁香97| 日日婷婷不卡| 大香蕉五月天| 色月丁| 成人av在线电影| 丁香久久五月天视频在线观看| 人人综合色| 久久久婷婷婷| 婷婷午夜综合| 五月五月婷婷| 爱99干99| 九九激情网| 亚洲这里只有精品| 99热这里只有精品2024| 天天日天天狠狠操| 丁香五月天AV在线| 日本综合色图| 六月丁香深深爱综合网| 九九热色视频| 99色综合网| 色五月婷婷91在线| 亚洲AV日韩在线观看| 色婷婷丁香五月天| 五月激情六月丁香| 五月激情在线| 就99这里只有精品| 成人视频一区| 久热精品视频在线观| 久婷自拍视频| 亚洲九九婷婷| 亚洲乱码在线观看| 五月婷中文字幕| cao视频,现在观看| av人人操| 久久九九九九| 婷婷内射视频在线| 亚洲综合五月天婷婷丁香| 亚洲精品另类| 日本99视频精品免费播放| AA片在线观看视频在线播放| 婷婷香蕉精品| 色五月综合97| 丁香六月啪| 久热69| 久久人操-久草婷婷-成人AV| 久久婷婷五月综合| 99九九99九九九视频精彩| 日屌日日操日日色| 综合99视频| 热久久99热欧美国产亚洲| 欧美成人网婷婷综合在线| 婷婷色色五月天| 色狠狠综合网| 日韩人妻无码一区二区| 丁香六月婷婷色XXXX| 丁香五月在线伊人| 日韩99色99| 蜜臀嫩草| 色五月婷婷在线| www.天天干| 久色婷婷200| 99久久极情精品一区| 欧美日韩AAAA| 啪啪激情网| AV在线免费网站| 亚洲免费99| www久| AV伊人青草丁香六月| 婷婷五月色播网| 99无码视频| 亚洲1区| 天天综合久久| 色色AV色色色东莞| 99色| 丁香五月婷婷高清| 天天玩天天摸| 99婷婷五月天激情| 久久狠狠欧美| 五月婷婷综合精品| 91欧美| 被男人添B超爽视频| 国产精产国品一二三在观看| 开心五月婷婷综合在线精品素人| 欧美性二区| 婷婷激情五月天激情在线| 天天模,夜夜模夜夜爽| 极品嫩草| 综合97五月| xx色综合| 國語久久婷| 午夜69成人做爰视频| 婷久久高清| 免费黄色AV| 欧洲99视频在线| 天天在线久久综合 | 99视频内射三四| 5月丁香综合网| 激情丁香六月| 青青久在线视频免费观看| 69人人操人人爽| 91碰碰视频| 婷婷综合| 91ncom.色| 五月丁香五月激情综合色综合| 丁香婷婷色情社区成人小说| 亚洲综合五月天| 五月丁香五月天现场视频| 婷婷亚洲久久| 丁香五月aV| 成人做爰A片免费看网站找不到了 噼里啪啦在线观看免费完整版视频 | 色婷婷综合亚洲| 亚洲另类婷婷五月丁香在线播放| www.五月丁香| 丁香五月婷婷免费视频| 色色色999| 亚洲综合婷婷| 五月天色五月| 色婷婷丁香网| 久草天堂| 91超碰在线播放| 热99这里只有精品视频| 久草久青福利| 在线不卡视频| 五月综合丁香婷婷| 伊人网碰碰| www.亚洲激情.com| 久久人妻高清中文| 丁香五月天91| 99热中国| 99热人人操人人操| 久久性爱视频这里只有精品| 色噜噜丁香| 激情五月深爱五月观看| 色色色图| 激情久久久| 草五月| 亚洲AV无码电影| 激情五月天婷婷久久久久久久久久久 | 激情五月天婷婷五月天| 婷婷久久亚洲| 香蕉综合网| 久久婷婷综合国产| 人妻操日日| 九九久久综合网站| 91免费试看| 丁香五月婷婷色播艳门照| 97人人干| 26uuu欧美亚洲日韩| 五月天综合久久| 五月激情啪啪啪| 91婷婷丁香五月| av无码电影| 日韩三及成人AV片| 九九青草热| 亚洲有码在线视频| 五月丁香综合激情| 日日干日日色| 九九热123| 激情图片婷婷| 色播激情| 五月婷婷中文字幕| 亚洲欧洲色色| 亚洲六月综合激情久久下卡| WWW久| 五月丁六月香| 日韩伊人大香蕉| 亚洲va成人va成人va在线观看| 亚洲av电影在线| 色情五月天A片| 五月丁香亭亭A片| 五月天天爽| 国产色视频网站2| 夜夜资源站| 99热啪啪| 大香伊人婷婷影院| 婷婷99狠狠躁天天躁| 激情丁香五月| 婷婷激情五月天视频在线| 婷婷丁香五月社区亚洲| 综合视频久久| 六月亚洲| 丁香五月综合激情性爱| 激情六月天| 五月WWW| 久久日曰| 国产毛片精品一区二区色欲黄A片| 亚洲色小说在线综合| 欧美五月婷婷| 热久久思思热思思| 五月婷婷草| 天天肏视频| 六月婷婷五月丁香首页| 亚洲激情Av| 九九综合| 色狠狠色噜噜AV天堂五区消防| 久久精品综合色| 五月天色丁香| 天天做天天爱天天爽| 色综合久久888| 激情玖玖sh| 综合久久99| 超碰在线国产| 青青日韩| 狠狠色色色| 九九精品综合| 婷婷五月亚洲一本在线丁香| 另类综合激情| 五月天大香蕉| 五月丁香婷婷激情影院欧美| 久久婷婷一级片| 天天综合情| 日本44久久在线| 在线色色| 丁香九月综合激情| 色爱亚洲| 9久热这里只有精品| 午夜成人综合| 激情性爱网站| 久久五月天精品视频| 婷婷中文在线| 99超级碰碰| 69er小视频| YJLZZJLZZ亚洲乱熟无码| 五月丁小婷婷激情四射| 久热在线中文字幕色999舞| 五月丁香激情综合六月涩涩爱| 欧洲MV日韩MV国产| 成人无码精品1区2区3区免费看| 人人视频人人干人人做| 激情小说视频图片网| 丁香午月AV中文字幕| 日本人妻操| 欧美成人AAA片一区国产精品| 情色五月天网站| 五月丁香婷婷开心| 丁香六月婷婷综合在线| 婷婷五月天干干| 99热无码精品| 婷婷国产综合| 欧美五月丁香啪啪响视频| 91九色 婷婷| 丁香花操逼| 99九九精品视频推荐| 大战熟女丰满人妻AV| 岛国AV网| www色婷婷| 97碰| 亚洲色五月天| 五月丁香啪啪啪| 丁香5月激情网| 激情五月天啪啪| 亚洲激情六月丁香| 久久婷婷丁香五月宗合| 久Se视频在线观看| 九九RE视频在线精品| 九九热在线99| 五月综合久久| 五月丁香六月婷婷不卡免费无码| 五月婷六月天| 成功精品影院| 小视频久久久aaa| 天天色播| 狠狠色丁婷婷日日,伊人激情综合网| 综合AV在线| 激情爱爱网站超大免费| 超碰99在线| 婷婷成人综合| 小视频一区| 九九机热| 大香蕉婷婷五月| www.五月天婷婷| 欧美久久网| 五月天激情亚洲| 久色| 激情网色五月| 丁香五月婷婷激情网| 99综合在线| 99色综合网| 激情深爱婷婷网| 婷婷丁香六月影视| 六月丁香五月天| 色噜噜狠噜噜视频| 五月婷婷综合在线| 色婷婷综合丁香五月天| 五月天日日操夜夜操 | 九色综合网| 国产jd1024基地手机看国产| 99热综合在线| 五月丁香 啪啪啪| 97婷婷五月| 99精品在线观看视频| 色玖玖爱| 久久九九激情五月天| 日韩久久日| 婷婷色色丁香五月天| 任你艹| 伊人午夜综合色啪| 五月婷婷六月丁香综合在线| 97操碰在线97| 五月婷婷狠天天色综合| 亚洲六月婷婷| 国产在线激情视频| 国产成人网站在线观看| 开心五月色婷婷综合开心网| 99热最新| 最新久久99视频网站| 婷婷涩五月| 天天操天天操综合| 色综合伊人网| 日韩日比视频| 婷婷六月五月| 亚洲欧洲中文日韩久久AV乱码| 热久久这里只有三级视频| 亚洲成人一区| 色播播五月| 国产精产国品一二三在观看| 亚洲成人一区| 成人在线日韩欧美| 男人的天堂99| 亚洲人妻一区二区| 婷婷九月色| 婷婷五月中文字幕| 天天做天天摸| 六月婷婷色色网| 另类激情五月| 久草a片| 亚洲宗合激情| 熟女乱论网| 亚洲色图五月丁香| 黄色五月婷| 婷婷色色播五月天| 国产成人精品亚洲线观看| 亚州操逼网| 日韩在线aaa| 大香蕉伊人久久| 99riAV国产精品视频| 狠狠干五码| 99热国产| 伍月婷婷免费视频| 五月天激情婷婷| 丁香五月综合激情啪啪| 婷婷九月丁香| 碰碰操91| 狠狠99| 中文字幕久久婷九女同| 婷婷五月天偷拍| 中文字幕网伦射乱中文| 婷婷五月天,影院| 91狠狠综合久久久久久| www.99色| 国产色色视频| 欧美性丁香色色五月天综合爱爱| 国产精品美女久久久久AV超清| 91爱啪啪| 天天天天天天操| 亚洲午夜av| 婷婷五月综激情| 五月色亚洲| 久久这里只有精品8| av在线免费播放观看| 六月婷色六月| 青青草原爱爱网| 狠狠撸激情综合丁香五月天俺来啦| 99噜噜噜在线播放| 欧美色色色| 日韩99无码| 99爱在线视频观看| 久久在线92| 五月开心网| enecarbon-materials.com污K127封锁请涟系@wip1688 | 天天 日综合| 婷婷五月在线视频| 日日懆天天懆| 久操人| 少妇人妻人伦A片| 在线观看免费狠狠色丁香香综合| 九九99在线免费在线观看视频| 色5月婷婷| 丁香婷婷啪啪| 色五月婷婷DVD| 色婷婷狠狠久久综合五月| www.亚洲激情| 色域五月婷婷丁香| 亚洲欧美在线观看| 五月丁香六月婷婷成人电影| 天天做天天爱天天爽夜夜揉| 超碰在线免费观看3 9| 色五月丁香六月欧美综合| 一起操 91N.com| 丁香五月在线自慰| 欧洲日韩一区二区三区| 噜噜狠狠色综合久| 久热无码| 91人碰| 伊人网欧美在线男人天堂五月丁香| www.狠狠| 四月婷婷五月丁香| 亚洲激情无码久久| 五月天怕怕| 丁香六月婷婷久久综合| 96五月丁香熟女| 丁香五月91| 嫩草AV久久伊人妇女超级A| 丁香五月天激情网| 丁香五月婷婷深五月| 91无码一起草| 五月丁香六月欧美综合网站| 日日夜夜狠狠干| 五月丁香精品| 真实熟女-91九色| 超碰人妻在线| 九九激情视频| 激情五月天之六月婷婷| 91avse| 秋霞少妇AV网站| 伊人久久大香蕉网| 天天天天色天天天天天干| 婷婷久久五月丁香| 五月激情综合性爱| 激情涩播| 色综合五月天| 色综合久| www.久久爱.com| 亚洲VA在线| 婷婷丁香成人| 98永久精品| 日本黄 色 片| 激情五月婷| 国产婷婷综合| 亚洲色网络| 婷婷久久国产视频| 密黄站| 婷婷五月天久久综合88| 91在线观看www| 色婷婷激情| 亚洲视频二区| 97人人看| 五月丁香大相交| 国产精品成人av在线观看春天| 99,色| 五月天基地| 久久婷婷五月综合色欧美| 丁香婷婷影院| 五月婷婷片| 婷婷黄色| 97碰免费视频在线| 天堂A∨在线| 婷婷五月天小说| 亚洲视色| 五月婷婷片| 91大屁股| 五月天堂在线| 五月婷婷激情综合视频| 六月久久狠狠| 色色色9| 色婷婷丁香AV综合| 久久久区区一久久久久久| 五月婷婷六月丁| 色婷婷五月影视| 日韩综合网络男女香蕉a片| 日韩免费99| 五月婷婷黄色毛片| 日韩精品一区二区亚洲AV观看| 五月综合精品| 久热只有这里精品| 久久99热久久99精品| 国语精品探花| 亚洲五月天婷婷| xxx.色婷婷| 99这里只有精品|v| 91色逼| 五月丁香婷婷色色| 五月天综合久久| 六月丁香五月婷婷| 超喷97免费在线视频| 天堂成人A片永久免费网站| 蜜臀AV在线观看| 色www久视频| 色欲久久99精品久久久久久| 丁香五月很很肏| 九九九九九九毛片| www久久99| 麻豆精品| 99精品视频在线观看| 五月丁香六月片| 91av成人| 综合激情视频| 播丁香五月婷婷欧美| 综合久久五| 丁香五月天激情四射网络不好| 综合九九久久| 婷香五月网在线| 国熟女视频| 深爱激情网五月天| 五月婷婷色色色| 久久伊人大香蕉| 超PEN精品在线| 午夜日韩久久久网站| 自拍偷窥99热| 亚洲性图一区二区| 五月婷婷人人人操| 热热色色五月天婷婷| 午夜色丁香| 99热在线观看| 天堂AV在线看| 五月婷婷在线丁香| 欧美激情-区二区三区| 五月天激情四射网站| 九九人人操| 大香蕉视频婷婷| 91爱操| 五月色欧美| www.射伊蕉婷婷| 天天干天天拍| 六月婷久久| 激情WWW| 殴美日韩成人| 综合色在线| AAA久久久| 操熟女成人网| 91啪啪视频| 97偷拍在线视频| 日日干日日色| 99色网站| 99热久久日本| 丁香五月丁香伊人| 丁香桃色网| 午夜av网| 伊人色欲五月天| a在线观看| 99ri国产精品| 久久婷婷五月草视频| 日本精品99网站| 婷婷五月丁香色色| 99热日本| 久热久| 色域五月婷婷丁香| 激情综合五月婷婷| 婷婷综合玖玖五月| 欧美色小说婷婷| 天天狠天天叉| 中美月韩免费A片| 91精品久久久久久综合五月天| 狠狠综合网| 99在线观看视频| 思思热精品在线| 《亚洲操B久久免费在线观看,亚洲操B久久在线播放》在线播放 - 高清资源 - 97 | 亚洲国产精品二二三三区| 久久久五月五丁香| 啪啪操超碰| 五月丁香A片| 婷婷五月天人妻| 天天射影院| 五月丁香婷婷在线| 超碰免费成人| 伊人www22综合色| 国产激情婷婷| 丁香九月激情久久| 人人爱人人草| 99热国产婷婷| 狠狠干五月天| 日韩淑女人妻luan伦激情精品一区二| 99热这里只有免费精品| 99五丁香月| 伊人久久五月天| 色婷青青| 婷婷五月天激情综合深爱激情| 野战J办公桌椅H| 色婷婷五月天激情在线播放| 99国产精品久久久久久久久久久| 五月丁香六月欧美综合| 综合AV网| 怡红院视频| 99热在线爱| 日本婷色| 九九人人操| 精品久久久人妻| 婷婷六月激情小说网| 久久久久人妻精品| 婷婷五月AA五月在线| 99ER热精品视频| 欧美Va在线| 色在线免费观看| 婷婷五月综合亚洲| 91九色国产在线| 99热最新| 亚州日本欧州韩美高青高潮一| 97操操网| www.激情五月| 欧美日韩成人在线| 少妇大叫太大太粗太爽了A片| 五月丁香婷婷六月天| 91碰免费视频| 丁香六月色婷婷| www.夜夜| 99热无码| 亚洲美女高潮久久久久久69| 91精品综合久久久久久五月丁香| 五月婷婷免费视频| 五月丁香成年黄色| 97啪啪| 五月婷婷丁香五月婷婷| 亚洲超级碰| 日本三级韩三级99久久| 五月婷婷自拍| 99re66热这里只有精品| 91久女| 五月丁香成人| 婷婷亚洲五月色综合| 99色免费| 风流少妇A片一区二区蜜桃| 国产精品热搜丁香五月婷婷| 91精品婷婷国产综合久久| 激情五月天婷婷| 五月丁香六月情| 婷婷丁香社区网| 男人的天堂99| www久| 五月天伊人网| 99人这里只有精品| 九九精彩久久| 成人五月丁香花| 99人人干| 五月天婷婷影院影院观看| 婷婷久久五月天| 色色色丁香| 五月丁香综合激情| 亚洲欧美婷婷五月色综合| 丁香五月婷婷性爱| 超级黄色片| 亚洲三A| 九九黄色网| 六月丁香啪| 4399成人黄A片| 欧美激情VA永久在线播放| 梁铮版《蜘蛛女侠》在线| 色99婷婷五月天| 日日操夜夜擼| 91超级碰| 亚洲五月婷| 激情亚洲网| 婷婷五月天激情综合| 日本啪啪网| 久久99草五月婷婷| 强辱丰满人妻HD中文字幕| 97在线视频人妻九色| 79色色色色| 婷婷五月开心中文字幕色| 任你爽免费视频| 艹天天射| 国产色香蕉精品五夜婷| 西西4r午夜剧场| 欧美性猛交 XXXX 乱大交| 99人人干| 91久久| 99只有这里有精品在线视频| 丁香五月激情在线| 欧美VA在线观看| 色婷五月天网站| ji'qing'luan'ren'lun| 人人玩人人橾| 精品无码av丁香五月激情| 伊人久久99| 操操人人| 激情综合色网| 久久黄A片| 欧美精品999| 色99热| 久9精品视频| 亚洲成人网站在线播放| 超碰在线中文字幕| 婷婷涩涩五月天| 91九色小视频| 亚洲美女高潮久久久久久69| 狠狠香蕉| 婷婷激情五月天天天开心| 99re99热| 日本婷婷丁香五月| 丁香五月天欧美| 五月激情婷婷播播网| 26UUU在线观看| α久久| 日本va欧美va欧美| 激情文学五月丁香六月婷婷| 色五月婷婷亚洲最大| 九九无码| 天天天天天日| 欧美成人精品A片免费一区99| 在线观看国产高清视频免费网站| 五月网站| 丁香五月天社区婷婷| 久热久操久热久草国产91| 色婷婷综合成人| 亚洲中文字幕网| 色色色在线免费视频| 天天操天天操天天操| 色婷婷久久综合丁香五月| 99免费热视频在线| 日日噜噜夜夜狠狠久久丁香六月| 91色婷婷综合久久中文字幕二区| 97在线观视频免费观看| 日韩无码系列| 色色综合成人网| 另类小说五月天激情| 五月婷婷丁香在线| 欧美色图天堂网| 欧美成人精品A片免费一区99| 亚洲AV久久久久久久久久久久久久久久| 五月天激情黄色网址| 五月婷六月| 国产精品涩涩涩视频网站| 精品国婬伦V无码久久久| 六月撸婷婷| 亚洲成色综合网站免费观看| www,99热| 五月婷婷丁香五月| 99热伊人综合| 九九色色| 久久99精品久久只有精品| 97天堂| 色九月综合| 91成人品| 久久精品亚洲热| 色婷婷久久综合| 四川BBB搡BBB爽爽视频| 全高清无码视頻| 99热大片| 人人爱国产| 九月婷婷人人操人人舔人人爱| 丁香五月另类色婷婷麻豆| 天天干天天操天天上| 国产9色在线/日韩| av五月天婷婷丁香| 久久婷婷成人视频| 九九精品热播| 亚洲传媒在线观看| 激情六月下句是什么| 可以看的AV| 国产精品18久久久| 国产脫衣舞一区二区三区| 亚洲九九在线| 99操碰| 99九九在线视频| 可以直接看的AV网站| 久久久久人妻| 五月天综合激情网| 婷婷六月久久综合导航| 98国产精品综合一区二区三区| 在线另类视频| 色播五月| 久久婷婷五月免费视频| 激情99| 五月婷婷啪啪啪| 色五婷婷开心缴| 婷婷丁香五月天激情四射| 激情六月丁香综合| 五月丁香六月激情欧美综合| 国产日韩av片| 婷婷五月丁香六月| 一级韩国产精品毛| wwwC0maV五月花| 粉嫩AV久久一区二区三区| 婷婷五月丁香av网站| 99九九在线| 欧美性爱一区| www,com,五月色色| 91视频久久久| 五月色丁香| 在线成人国产| 色色网五月激情| 99爱在线| 思思热精品在线观看| 一级AV片| 伊人超碰在线| 岛国AV网站| 97久久精品视频| 亭亭五月天成人| 偷拍九九热| 99热99干| 丁香五月婷婷久久久| 日韩精品二三区| 九九色情网五月天| 天天日本夜夜谢| 久久视频婷婷| 99精品一二三四视频| www.五月天婷婷| 九九亚洲综合| 久久丁香| 色色色综合| 这里只有精品在线播放| 国产97在线日韩亚洲女人被黑人巨大| 思思热国产在线| 色五月激情问网站| 日本色五月| www.久久久久久久| 婷婷激情图片| 国产视频久色| 久99久视频精品| 熟女激情五月天| 91视频一起草| 成人小说 五月天 婷婷| caop视频| 婷婷亚洲五月| 狠狠色婷婷7777久| 亚洲经典三级| 婷婷五月无码| 五月丁香婷婷综合久久| 激情网五月天| 99精品在线下载| 99碰碰中文| 五月丁香婷婷基地| 婷婷综合网在线| 精品操逼一区二区| 欧美97色| 五月天成人网婷婷| 色色网91| 婷婷基地爱| 蜜乳A√| 色欲婷婷五月天丁香| 99热在线观看免费精品| 久久久久久丁香五月| 丁香五月婷婷综合精品素人| 丁香五月婷婷网| 中文网av| 六月婷婷激情| 九九婷| 五月丁香久久久久| 激情综合网,婷婷五月天| 久久全色| 久久亚洲婷婷| 久机视频这只有精品| 色色日韩网| 色九月综合| 亚洲激情五月| 五月叮香啪| 激情q青青草在线婷婷| 九一牛视频探花| 五月天激情久久| 99亚洲无码| 五月丁香美女| 欧美性猛交99久久久99| 丁香久久在线| 99九九视频| 婷香五月激情视频| 亚洲激情视频网| 九九色影视| 九月婷婷综合在线| 丁香网站| 天堂A∨在线| 婷婷六月情| 99色最新在线视频| 涩综合网| 性色综合网| 农村熟妇高潮精品A片| 女婷久久| 五月天开心婷婷激情网站| 五月丁香婷婷综合激情基地| 91无码视频| 色婷婷玖玖影院| 91久久久久久久久久18| 天天影院色| 综激情网| 超碰国产在线观看| 五月天精品视频| 久久狠狠色| 九九热99re8热免费观看| 精品99在线| 2021日韩无码| 亚洲日比视频| 熟女人妻一区二区三区免费看| 九九热欧美| 97干婷婷| 十一月婷婷激情四射| 亚洲激情网站| 五月色婷婷激情| 婷婷色香六月综合激情| 都市激情久久| 婷婷五月天成人网| 九洲一级A片| 天天综合久久| 91在线视频综合| 亚洲视频1区| 色婷婷yy久| 99综合色色色| 4399无码视频二区| 久久精品熟女亚洲AV麻豆| 成人超碰网| 亚洲偷| 影音 五月 婷婷 久久| 牛色色碰| 天堂久久丁香| 成人五月天。COM| 99热伊人综合| www. 五月. com| 五月叮香啪| 欧洲精品爱爱| 91操片| 区区久久妻| 欧美天天五月丁香免费观看| 高清激情av在线观看| 激情欧美婷五月| 五月丁香 啪啪啪| 色婷婷五月综合网| 国产日韩亚洲欧美在线观看| 思思热视频在线观看| 色99视频| 五月丁香啪啪网| 免费黄色片子| 丁香香蕉射射射| 9999热在线| 光棍影院日韩精品| 欧美三级欧美一级| 激情美女五月天| 精品人妻久久久| 天天搞天天色综合| 五月天婷婷AV| 五月婷婷色五月| 欧美性色A片免费免费观看的| 日韩人妻白浆视频系列| 色色网91| 日本色色图| 六月婷婷狠狠色在线观看| site:feetmall.com| 99综合| 色婷婷五月天偷拍| www.色多多婷| 欧美成人日韩| 婷婷色色狠狠| 五月香六月婷| 大香蕉婷婷五月| 99∨VTV| 中文字幕精品推荐免费在线观| 狼人婷婷久久| 日本www五月婷婷| 思思re99视频在线观看| 99久久婷| 无码成人AAAAA毛片AI换脸| 99热日本精品| 激情五月,色五月| 五月色丁香激情| 涩综合网| 97丨九色丨国产丨PORNY| 色99视| 丁香五月天激情婷婷丁香六月 | 人妻体体内射精一区二区| 久久玖玖99| AV九九| 九九久热| 97久久超碰| 亚洲久艹| 99热这只有| 99综合| 亚洲乱码日产精品BD| 97色操| 丁香五月天在线直播观看| 99热精品在线观看| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 天堂AV三级| 日本高清综合网五月丁香| 色色色99| 91视频五月丁香| 五月丁香六月情婷婷久久| 九九综合| 91丨人妻丨国产丨丝袜| 综合婷婷六月| 综合另类视频| 墨西哥毛片内射精| 青青热久精品视频在线观看| 超级碰碰91| 五月婷婷黄网站大全| 天天拍夜夜撸| 九九99免费视频| 伊人超碰在线| 亚洲五月综合色播| 日日操夜夜爽| 婷婷爱爱蜜臀天天操| 五月激情久久综合网| 少妇熟女视频一区二区三区| 超碰9| 99热97| 狠狠色婷| 久热这里只有精品66| 天天干,天天日| 影视av久久久噜噜噜噜噜三级| 欧美激情综合色丁香婷婷五月天| 色色激情五月天| 亚洲欧洲另类| 婷婷永久在线| 人妻视频在线| 婷婷狠狠操| 31色区视频免费看| 亚洲色色精品| 少妇性按摩无码中文A片| 思思99热热热99| 91婷婷丁香| 久久伊人9| 日本五月天网站| 超碰人人操人人9| 久久人妻伊人| 色婷婷激情视频| 99成人免费视频| 久草婷婷网| 26uuuu精品一区二区| 一本大道嫩草AV无码专区| 亚洲日本激情| 色5月婷婷| 五月天五月色婷婷综合| 99这里都是精品| www.天天干.com| 久久久人妻| 97五月天婷婷午夜| 综合婷婷| 深爱激情九九五月天 | 五月婷婷综合视频| 热九九在线| 97人人草| 五月色欧洲| 日韩成人影片网站| 婷婷激情五月综合丁香社| 成人婷婷色综合| 开心五月天激情网站| 欧美激情-区二区三区| 婷婷午夜天| 国产精品丝| 亚洲精品视频在线播放| 日本三级中国三级99人妇网站| 五月天开心激情综合网| 五月丁香网av| 婷婷99视频在线| 嫩草乱码一区三区四区| 日本99色| 五月天婷婷无码| 五月情综合| 婷婷五月丁香成人网| 丁香六月欧美| 日韩啪| 狠狠色丁香| 亚洲久热无码| 婷婷五月天网址| 五月婷婷香| 婷婷六月插屄激情| 色综合久久88色综合天天| 91精品综合久久婷婷九色| aⅤ79成人片| 国产AV一区二区三区最新精品| 能直接看的AV网站| 97se视频在线| 五月婷在线| 五月天激情婷婷五月天久久| 超碰丁香五月| 超碰人人干| 天天拍夜夜爽日日| 欧美激情久| 99久久网站| 巴基斯坦粉嫩无码视频| 亚洲性爱电影| 丁香五月激情综合| 日本五月婷婷| 色婷婷丁香网| 色婷小说| 欧美精品99久久久| 日日撸日日操| 九九九九毛片| 热久综合| 97人人草| 丁香五月亚洲| 丁香五月亚洲AV| 97人人操人人拍| 色情综合网| 婷婷五月天日本无码| 色碰碰| 色五月天婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷婷 | 五月丁香免费看| 丁香五月五月婷婷五月天激情四射| 97香蕉久久超级碰碰高清版| 精品一二三区久久AAA片| 激情深爱五月天| 在线综合婷婷| 噜噜噜狠狠色综| 久久99草五月婷婷| 色色色99| 激情久久久久久久久久| 色噜噜在线| 五月天丁香六月综合| 99热www| 99国产精品久久久久久久久久久| 亚洲午夜一区二区| 97韩国久久电影院| 丁香色五月婷婷17C| 久久超级碰视频| 婷婷.com| 人人爱操| 啪啪激情网| 欧美婷婷成人| 狠狠色噜噜狠狠狠888了| 大香蕉九九| 婷婷终合色图| 超级碰 久久9| 欧类av怡春院| 99热这里只有精品国产免费| 69午夜成人影片| 天堂婷婷丁香六月网| 九九激情综合| 伊人五月天97| 成人性生活免费观看。| 婷色五月天| 激情小说视频图片| www.日本91| 欧美成人性爱网| 思思w99| 色色色视频| 激情综合5| av色婷婷| 日韩成人电影在线播放| 色综合久网| 91美女啪啪| 久久婷婷青青| 欧美怡红院黄站| 中文字幕乱码亚洲精品一区| 99人人干| 五月天激情网图片| www.日日夜夜.com| 99在线精品观看99| 婷综合| 日本久久综合| 九九色影视| 碰碰91| 天堂久久精品| 久激情网| 欧美色五月| 91操碰| 九九这里有精品| 五月婷婷丁香六月| 五月激情小说| 国产精品涩涩涩视频网站| 开心五月婷婷激情| 九九热视频在线观看| 热久久这里只有精品| 嫩草AV久久伊人妇女超级A| 婷婷精品| 亚洲精品久久久久久久久久飞鱼| 777影视理论片大全在线观看| 国产精品国产成人国产三级| 色五月综合| 男人先锋久久| 丁香五月玖玖| 性爱五月婷婷| 日本久久超碰| 91久久久久久久| 99色综合网| 婷婷久久五月天亚洲欧美国产日韩在线观看 | 九九操操| 婷婷伊人网| 91人人人人人| 九月婷婷人人操人人舔人人爱| 激情文学 综合 九月| 婷婷欧美激情| 熟女激情网| 婷香五月网在线| 六月丁香五月亭亭| 五月丁香婷爱在线| 丁香五月六月综合欧美| 久久98热re| 99无码视频| 69凹凸成人综合网| 色五月,婷婷大香蕉| 一起草Av| 色播五月天天| 热99这就是精品视频| 亚洲精品国产成人AV在线| 91九九| 色9999综合久久| 97资源欧美日韩大香蕉超碰一区| 涩涩涩,com| 天天综合天综合| 91日本在线| 国产欧美日韩综合精品一区二区| 丁香五月天日韩无码| AV在线观看网站| 成人AV在线网站| 日日操夜夜爽| 99热8| 色色草97| 综合亚洲六月婷婷在线| 亭亭社区五月天| 婷婷欧美综合| 不卡在线视频| 久热中文字幕| 亚洲精品小视频| 97久久人人| 色爱99| WWW.桔色成人.COM| 色婷婷91| 色 丁香婷婷| 99激情| 国产偷人爽久久久久久老妇APP| 九九99男女视频在线观看| 91丨熟女丨首页| 日婷婷| 超碰v| 99ri国产在线| 五月综合色播播丁香婷婷| 性爱综合网| 九九热99精品| 激情婷婷亚洲五月| 99热爱爱干干日| 免费在线观看av网站| 五月婷视频久久| 99热在这里只有精品| www.夜夜操| 96精品久久久久久久久| 婷婷综合六月| 激情五月综合网| 国产成人综合在线| 婷婷丁香五月综合激情小说| 婷婷激情六月| 五月天综合久久丁香91| 99热12| 99热66| 婷婷五月花| 天天干天天干天天| 五月激情综合婷婷| 六月综和久久| 色色五月婷| 91疯狂操操操操| 久久色这里只有精品| 狠狠精品干练久久久无码中文字幕| 97色在线观看视频| 亭亭五月色男人| 中文毛片无遮挡高潮免费| 就是色婷婷五月亚洲色| 午夜爱爱网站| 国产精品视频网| 久久色五月天综合网| 日日鲁鲁鲁夜夜爽爽狠狠视频97| av九九| 99精品久久久久久久婷婷| 久久久精品99| 久久精品亚洲一级牲爱综合 | 97色欧美| 九九热精品视频| 亚洲国产网址| 欧美激情凹凸丁香网| 六月成人网| 色婷婷丁香五月在线| 色丁香五月婷婷| 国产伦理精品高清在线观看网站一区二区| 亚洲VA口| 99视频在线啪| 五月婷婷成人| 久久综合网桃花| 99热在这里只有精品| 色吊丝99| 色五月综合在线| 婷婷久久女人| 第五色色色婷婷| 国内在线99视频| 夜夜爱网站| 久热伊人9| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 亚洲色激情| 在线sebiav精品视频| 天天干天天色综合| 日本色色网站| 婷婷九月激情|