99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

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
返回資訊列表
麻豆AV一区二区三区| 97福利视频| 任你搞免费视频观看| 国产一二三四五六七八视频| 欧美97色| 色五月婷婷五月天激情综合| 202丰满熟女妇大| 这里只有精彩视| 亚洲成人在线综合| 色婷婷激情视频| 色五月婷婷综合| site:esunnet.com| 综合AV在线| 天天日天天久久青青| 爱婷婷都市激情| 激情五月黄色小说| 九九碰九九爱97超| 国产精品国产| 99伊人婷婷在线| 五月丁香久久| 91超级碰碰碰| 另类在线| 五月婷丁香| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇| www.粉嫩av.com| 狠狠爱婷婷五月天| www五月婷婷| 婷婷五月丁香啪啪| 色色色婷| 玖玖99免费视频| 婷婷五月天色网久| 五月噜噜| 4399成人黄A片| 亚洲av电影在线| 亚洲天堂色色| 第五色婷婷| 亚洲激情免费视频观看| 99re热视频| 五月丁香| av 一区三区四区| 九月丁香欧美综合| 日本97久久久精品| 爆乳熟女一区二区三区爆乳 | 婷婷五月天激情四射| 丁香婷婷激情| 大香蕉婷婷五月| 丁香五月婷婷激情中文| 丁香五月中文字幕久色| 99愛国产| 噜噜狠狠色| 丁香五月综合网亚洲综合欧美狠狠| 丁香六月啪啪啪| 秋霞av不能| 深夜婷婷 丁香| 久久九九网| www.亭亭五月天| 国产美女最新VA在线免费观看| 久久天天天| 亚洲五月天激情| 79色色色色| 96性爱视频| 亚洲俩性性爱图片久久第六页| 二色AV| 99九九热在线观看| 丁香蜜臀黄色婷婷五月天| 97狠狠色| 天天爽,天天操。| 久久婷婷成人视频| 亚洲激情免费视频| 中文字幕视频在线播放| 婷婷丁香六月| 久久色午夜在线导航| 五月天激情美女久久| 中文字幕 中文字幕明步| 日本色色色| XX久久| 亚洲在线操| www.色综合.com| 91干在线| 黄色三级毛片中字| 丁香婷婷老熟女综合网| 老妇操B| 超碰a女人的天堂| 亚洲无码另类| 五月婷婷精品无在线| 这里只有精品网站| 大香蕉婷婷丁香视频在线| 丁香六月婷婷综合欧美| 激情五月综合网| 婷婷激情五月天天天开心| 婷婷九月激情| 色呦呦美女| 五月丁香久久| 丁香六月婷婷激情| 久热只有这里有精品| 五月丁香怕怕综合| 99热这里只有精品99| 一区二区乱码视频| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 天天色天天操天天射| 久久与婷婷| 热九九精品| 五月婷A V在线| 成片免费观看大全| 91热er| 成年人看Va免费视频| 五月天播播中文字幕| 超碰人人在线| 国产一级黄色影片,| 97丁香五月| 狠狠爱婷婷爱| 99在线精品视频免费观看20| 五月婷婷激情综合| 日本黄色在线观看| 五月婷综合网| 99久久九九| 日韩三级视频一区二区| 色五月在线| 天天精品视频免费观看| 大战熟女丰满人妻AV| 色综合久久88色综合天天| 五月婷婷偷拍| 色色色色热| 99热18| 9伊人网| 69堂午夜视频最新地址| 日本三级日本三级99| 无码少妇高潮喷水A片免费| 九九综舍久久| 色色色色色色色色色色色色色97| 4399在线观看免费高清毛片| 怡红院精品视频久久久久久久久| 99∨VTV| 99亚洲视频| 国产精品久久久久久久久久免费 | 欧美久人人| 五月婷婷亚洲天堂激情在线| 九九激情| 五月丁香怕啪啪| 久综合| 欧美123区免| 五月丁香六月欧美综合| 搡BBBB搡BBB搡18| 五月天操逼网| 啊v视频在线观看| 久久99精品久| 激情综合激情综合| www.色9| 玖玖资源站中文| 精品一二三区久久AAA片| 久久免费试看120秒| 99精品视频在线| 桃色五月天| 五月丁香六月激情综合| 九九re精品视频在线观看| 第1影院之五月婷婷| 五月婷婷在线网站| 影音先锋男人av资源站| av狠狠操| 亚洲九区| 五月丁香六月婷婷综合免| 亚洲乱码在线观看| 色婷婷五月天av在线| 这里只有精品视频在线| 99色热视频| 中文成人在线| 五月丁香亚洲校园欧美| 99精品成人无码A片观看金桔| 超碰a女人的天堂| 丁香五月天婷婷激情| 99久热在线精品99re6热| 日 日干 日日做| 中文字幕 中文字幕明步| 综合五月天亚洲婷婷| 操97免费超级视频| 激情综合自拍五月婷婷色五月| 九九99免费视频| 婷色五月| 婷婷五月天99综合网站| 伊人激情影院| www.久久爱.com| 91无码视频| 婷婷视频网| www色色com| 九九人妻福利| 亚洲乱码日产精品BD在线观看| 99成人网站| 9999久久久久| 日本颜色视频人人爱| 大香蕉久久久久久久久| 九九热欧美| 91精品电影18T| 五月婷婷色播视频| 无语停婷丁香网| 中文av网站| 99在线精品视频| 99爱视频在线观看这里只有精品| 五月婷婷激清网| 国产亚洲色婷婷久久99精品91 www.riverspirits.org www.hnnun.com www.changh | 啪啪啪综合网| 九九热内射| 婷婷少妇激情| 婷婷六月天亚州| 人妻操日日| 久久五月丁香| 婷婷涩涩五月天| 丁香婷婷九月| 色啪久 | 丁香五月天色婷婷| 五月丁香六月激情欧美综合| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 色婷婷文字幕| 极品人妻VIDEOSSS人妻| 成人五月天丁香| 开心五月婷婷六月丁香| 97狠狠色| 99色免费| 激情性爱五月天网页| 欧美狠狠色| 久久婷婷五月天激情新地址| 亚洲综合五月天婷婷| 在线超碰91| 欧美性爱五月天| 色五月天本日| 天天干天天日日| 99丁香五月婷| 开心久久网婷婷| 99久久9| 色婷婷www| 婷婷色婷婷亚洲成人| 综合五月激情| 国产精品久久久爽爽爽麻豆色哟哟| 婷婷丁香五月亚洲17cao| 丁香蜜臀黄色婷婷五月天| 99综合入口| 99久久婷婷国产综合精品草原| 亚洲va欧美va天堂v国产综合| 99热99在线| 丁香五月婷婷图片综合| 久久综合久色欧美综合狠狠 | 五月天色婷伊人| www、丁香五月天| 天天色天天| 婷婷色日本| www.99热| 五月丁香六月色婷| 午夜婷婷丁香| 开心五月六月婷婷| 色五月涩涩婷婷| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 99热这里| 色婷婷AAA| 色色色色区| 亚洲综合色成丁香五月色| 婷婷丁香五月亚洲17cao| 天天射综合网夜夜操| 色亚洲无码| 99ri视频在线播放| 九九这里是免费的视频5| 天堂久久久久天堂网| 久久人妻精品| 久久99热这里只频精品6学生| 婷婷激情人妻| 丁香婷婷性爱| 激情四射五月天| 五月天天天天天天天天天天天婷婷婷| 色五月丁香五月| 丁香五月综合在线观看| 开心婷婷五月天激情网| 热久精品| WWW,五月| 精品人妻午夜一区二区三区四区| 国产99久久久国产精品免费看| 色五月婷婷久久爱| 99精品视频在线| 激情综合五月色在线| 夜夜涩涩涩| 婷婷五月亚洲激情| 青青草蜜臀| 丁香花五月天| 热99这就是精品视频| 欧美成人A片AAA片在线播放| 五月丁香亭亭操逼| 少妇被躁爽到高潮无码文| 免费看欧美成人A片无码| 99干免费视频| 97碰在线视频| 五月婷久久在线| 欧美成人精品一区二区 | 综合色视频| 五月丁香亭亭AV女优| 九色 在线| 综合色色网| 一区二区中文字幕| 婷婷播5月| 有哪些A片网站| 夜丁香综合| 思思热这里只有精品| 五月久久婷婷天堂视频| 国产亚洲色婷婷99精品| 婷婷香五月天| 五月天婷婷色| 伊人久热91| 色婷婷香蕉| 深爱激情网五月| 亚洲激情五月丁香久久久久| 婷婷激情人妻| 五月激情在线| 中文字幕不卡网站| WWW五月婷婷| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | 婷婷五月天av| 久久无码成人| 色五月婷婷激情基地| 婷婷五月天Av| 色婷婷五月天不卡| 丁香五月天电影| 久久99日本精品视频免费观看| 99热首页| 日韩AV在线免费观看| 婷婷久久免费看| 97碰碰在线观看视频| 免费视频在线观看的网站| 丁香五月欧美色综合| 久久婷婷欧美| 国产欧美日韩综合精品一区二区| 婷婷丁香五月综合| 大香蕉网站,大香蕉综合| www.第四色99| 四色女婷婷| 日日夜夜婷婷| 日韩啪啪视频| 99热都是精品| 激情性爱五月天| 日韩无码色色| 玖色色综合| 色色网站免费观看| 亚洲网站观看视频| 婷婷成人丁香色情基地30 | 激情五月天小说网| 国产99久9在线| 丁香五月网在线观看| 六月婷婷综合| 男人天堂伊人五月丁香| 97色伦另类图片小说视频 | 色七七色九九| www.9797国产| 九九综合色综合| 亚洲成人在线观看网址| 色狠狠色噜噜AV天堂五区消防| 99国产在线精品视频| 天天日日人| AV性爱在线| 91久热| 性爱综合网| 国产在线中文字幕| 激情av| 久久久18| 女人高潮内射99精品| 色情五月天视频网| 四虎国产精品永久在线国在线| 久久这里这里有精品免费视频| 色五月激情网| 激情5月婷婷狠狠干| 日日干日日| 日韩狠狠色婷婷| 成人无码精品1区2区3区免费看| 久久国产精品乱子伦_靑青草…| 99热这里只有精品8| 九九热九九| 99免费视频| tingtingzonghewang| 日逼影音先锋男人AV资源站| 色五月婷婷五月天激情综合| 狠狠爱婷婷爱| 97碰碰碰免费公开在线视频| 色婷婷AV久久久久久久| 区美毛片子| www色色com| 伊人春天av| 禁欲电影完整版在线播放| 日日操夜夜爽天天天| 五月激情四射网站| 99毛片| 久久XX| 国产真实乱了老女人视频| 激情操逼婷婷| 大香蕉久久久久| 免费AAAAA网| 丁香五月久久| 激情文学五月丁香六月婷婷| 日韩九区| 97日本在线播放| 亚洲另类噜噜| 亚洲五月天,激情视频| 天天天天干| 免费观看的AV| 久久久久久久久99精品| 色综合久久之分久久| 亚洲无码九九| 六月婷婷色综合| 图片区 小说区 区 亚洲五月| 深爱1激情网| 激情五月婷黄版| 99综合在线| 五月天天天操天天爽夜夜操| 超级碰 久久9| 99热首页| 性爱视频99| 五月天婷婷一起草| 男人天堂 久久| 九九av| 思思re视频在线| 天天综合网~91综合网| 亚洲成人在线在线| 久久99久久99精品免观看粉嫩| 久热久色| 久久人操-久草婷婷-成人AV| 五月天激情国产综合婷婷| 日本熟女一区二区| 99热思思久| 大香蕉在线99热| 思思热视频在线观看| 色婷亚洲| 免费的日逼视频| 绿色小导航AV| 婷婷五月天久| 精品香蕉99久久久久网站| 激情五月婷婷视频一区二区三区| 热无码A∨| 五月天婷婷免费| 91色色五月天| 五月天激情小说| 欧洲一区二区| www99热| 丁香五月婷婷色综合基地| 婷婷五月天午夜激情影院| 丁香五月之久操视频| 狠狠综合久久| 成人色图情色成人网 www.5b5b5bcom 五月天 | 久久永久网址| 九九热av| 欧美日韩91| 婷婷丁香婷婷97| 国产精品人成A片一区二区| 婷婷五月天狠狠色| 色婷婷六月| 99热亚洲精品66| 电影《战争与艾拉》免费观看| 51XX午夜影福利| 少妇婷婷五月天| 九九无毛| 精品国产a| 色噜噜狠狠色综合日日| 狠狠搞狠狠操| 国产av天堂| 丁香婷婷色五月| 女人被男人吃奶到高潮| 91热视频色网站| 激情六月综合| 色在线视频网2025| 99视频精品在线| 久久一热| 激情五月天婷婷| 久久99热这里只有精品| 色色色婷| 激情综合五月| 五月婷婷丁香六月| 91viP在线看| 爱射综合| 91久久婷婷| 9久热| 超碰av在线| 九九99久久| 99热在线精品观看| 无码日本精品XXXXXXXXX | 婷婷天堂综合| 99热最新网址| 影音先锋美国A| 欧美色图片88| 精品视频网| 婷婷中文字幕在线| 久热中文字幕| VA日本视频| 久久久er热| 日逼免费视频| 伊人在线视频| 婷婷香五月天| 在线看AV| 五月婷啪啪| AA丁香综合激情| 安息电影在线观看完整版| 天天五月香欧美| 亚洲激情电影五月天色婷婷丁香一起草| 99这里只有精品8| 夜夜爽天天日| 停停五月色宗合| 91精品久久久久久| 97成人在线视频| 天天干,天天操,天天射| 丁香五月亚洲AV| 婷婷五月天99| 超碰97人人操| 一起草AV入口| 五月婷久久草| 婷婷五月综合在线视频| 天天日天天操心| 婷婷激情社区| 丁香婷婷五月综合欧美另类| 五月丁香啪综合| 性色播| 激情开心五月婷婷| 欧洲色色| 国产毛片欧美毛片久久久| 91av视频| 婷婷免费成人视频| 97色色视频| 丁香五月天婷婷激情| 国产精品黑丝| 色婷婷五月天亚洲| 久久538| 这里只有精品视频在线| 久久久久久久久久婷婷| 丁香五月婷婷动漫视频| 婷婷五月丁香综合| 婷婷婷五月香蕉| 俺也去婷婷五月天第五色| 精品人妻久久久久久久| 五月天色综合| 99日精品视频| 毛片毛片毛片毛片| 女人高潮内射99精品| 91综合在线观看首页| 五月婷婷黄色| 91热久久| 77777亚洲午夜久久| 欧洲精品欧洲情| 97碰超级人人看| 亚洲欧美成人在线观看| 开心婷婷五| 久热超碰91| 99视频综合| www久久五月com| 一起草性爱不卡视频| 玖玖色综合| 六月婷久久| 人妻自慰高清合集| 久操香蕉| 五月永久激情| 99热9| 婷婷五月天丁香| 99色热| 超碰人人在线观看| 丁香六月视频免费观看| 俺去也五月天婷婷| 92久久| 噜噜噜久久| 伊人影院久久网| 五月丁香婷中文字幕| 99re6久热只有精品6在线直播| 五月丁香色综合| 六月婷婷在线视频| 亚洲国产网址| 五月天播播中文字幕| 黄色av高清| 国产五月婷| 成人片黄网站色大片免费毛片| 日本精品在线噜噜噜| AV网站免费在线| 日韩操逼大片| 久婷婷| www.91.com黄| 九九热re99re6在线精品| 色婷婷成人久久| 丁香五月婷婷骚视屏| 久热99| 激情五月天婷婷直播| 天天肏夜夜肏| 天天做天天视天天谢| www99热| Av性爱网| 免费观看全黄做爰的视频| 色狠狠伊人久久五月丁香| 久久九九综合| 色五月激情基地| 精品AV无码超碰| 婷婷五月情天| 91肏| 亚洲精品久久久久AV无码| 另类图片激情五月天| 桃色成人网| 久色国产| 大香蕉久久婷婷| 婷婷五月色情天| 热久久77777| 精品欧美性爱超级爽| 99综合一区| 五月丁香花视频| 丁香五月性| 77799热| 欧美A片在线视频免费观看| www色五月天| 婷五月天丁香婷五月| 日本啪啪天堂| 激情婷婷丁香五月| 操操熟女| 九九热精品| 9久热这里只有精品| 五月丁香趴趴| 激情丁香五月婷婷| 婷婷五月av| 香蕉综合在线| 草榴成人影片| 秋霞性爱AV| 婷婷五月天天| 另类精品视频在线观看| 中文字幕无码人妻少妇免费视频| 丁香五月开心五月激情| 婷婷色色五月| www,99色| 玖玖综合色| 五月丁香狠狠地噜噜噜噜| 高清国产AV| 国产亚洲成AV人片在线观黄桃| 天天色,天天日,天天做| 啪啪啪综合网| 亚洲 欧洲 国产 伦综合| 欧美人妻一区二区| 99热只有这里有精品| 五月婷视频久久| 国产精品24r| site:pnnrt.com| 91色情播放| 激情视频婷婷五月花| 婷久久久| 天天弄天天操| 欧美影院婷婷| 色播播五月天| 婷婷五月天第四色| 婷婷大美在线| 五月丁香婷婷久久| 99视频在线看| 久久您您综合网| 一起草av| 伊人网碰碰| 天天天天天日| 天天干夜夜欢| 亚洲一色色色色色色色色| 五月婷婷啪啪网| 手机免费福利视频| 碰碰91| 青青色com久久| 久久婷五月天| 亚洲免费观看高清完整版AV线| 襙比视频| 天天激情综合| 五月色婷婷亚洲| 久久99婷婷| 97人人操人人操人人操人人| caop视频| 国产做爰视频免费播放| 99热精品在线播放| 丁香六月婷婷色XXXXX| 这里只有精品久久| 女人天堂AV| 天天日天天摸| 久久伊人9| 丁香五月婷婷大香蕉| 丁香婷婷影院| 激情爱爱网站超大免费| 婷婷激情视频| 超碰av在线| 亚洲综合激情五月久久| 终合激情网| 精品色| 天天爽天天摸| 99亚洲视频| 99国产视频网| 亚洲婷婷免费| 婷婷色六月| 五月婷婷av| 99热成人| 综合激情在线| 狠狠综合网| 久久98| 免费视频WWW在线观看网站| 亚洲亚洲人成综合网络| 中字幕视频在线永久在线观看免费| 成AV人片一区二区三区久久| 国产精品第一国产精品| 少妇人妻丰满做爰XXX| 丁香婷婷天堂| 字母不卡码人逼| 在线sebiav精品视频| 婷婷久久图片| 人妻激情综合| 精品婷婷五月天| 日韩精品色| 婷婷五月中文在线视频| 婷色五月天| 精品久久久人妻| 超碰在线精品| 91九色最新视频| 久久久久久久久18久久| 国产激情在线| 国产亚洲99| 少妇婷婷五月天| 激情五月天伊人影院| 色99色| 色婷婷五月天在线观看| 亚洲精品国产A久久久久久| 日本WwW色偷偷丁香花久久久京东热| 五月丁香综合久久夜夜| 超碰9| 另类五月婷婷| 五月天婷婷综合免费| 日本三级中文字幕| 久热婷婷综合| 国产av基地| 丁香久色| 99九九在线观看免费| 国产成人网址| 婷婷天堂视频| 五月婷婷天天色| 色色日本| 欧美丰满熟妇BBB久久久| 五月色情精品| 五月天天丁香婷婷在线中| 色色色色色色综合| 99九无网码| 亚洲丁香五冃97色| 99久久99九九99九九九| 欧美人人草| 婷婷激情五月综合| 99视频综合网| 日本色婷婷综合| 色五月丁香婷婷| 亚洲亚洲人成综合网络| 人人操人人爽成人AV| 国产日韩欧美性生活| 99成人| 麻豆观看夏晴子| 99视频内射三四| 丁香婷婷深情五月亚洲| 久/久精品99看9| 丁香婷婷午夜| 91热视频| 激情婷婷丁香色情五月天| 久久伦乱| 伊人久久大香线蕉综合网站| 五月色婷婷综合丁香精品无遮挡| 人人综合久| 婷婷婷久久| 五月亚洲激情| www夜夜操| 色五月偷偷| 婷婷五月丁香色情| 99热精品在线| 五月丁香婷婷啪啪| 碰碰91| 97人妻碰碰碰久久久久-最近国语高清| 99热这里只有精品23| 五月天综合网| 五月天操逼网| 五月天激情啪啪| 国产99久9在线+|+传媒| 五月天婷a| 午夜天堂一区人妻| 天天日,天天射,天天插| jiZZdr| 久热综合| 色啪网| 99九九热在线观看| 乱码操操| 五月丁香激情婷婷| 激情五月天偷拍综合网| 欧美VA视频| 欧美婷婷综合| 2022人人操人人看| 五月综合激情视频在线| 99啪啪骑| 99色精品| 国产资源在线视频| 99碰网站| 99操逼视频| www.超碰在线| 99视频内射三四| 久久99热这里只频精品6学生| 大香蕉久艹| 超碰人人艹| se99高清无码| 五月丁香啪啪网| 色综合天天网| 亚洲综合狠狠艹| 婷婷基地爱| 激情深愛五月視頻| 天天天天操| 丁香五月天五码婷婷| av在线播放网站| 99视频只有这里精品| 影音先锋男人av资源站| 天天狠狠夜夜狠狠2023| 九九99在线视频| 丁香激情网| 日木狠狠干| 激情人妻综合| 夜夜躁狠狠| 三十熟女| 亚洲综合五月| 日夜操B| 色噜噜婷婷| 极品人妻videosss人妻| ...婷婷五月综合不卡,国产在线手机| 色五月五月婷婷| 婷婷五月天奸女| 欧洲第一无人区观看| 久久成人精品视频| 九九热在线99| 婷婷丁香成人| 狠狠色噜噜| www99在线观看视频| 五月天激情四射| 99成人无码| 国产免费av在线| 国产成人网| 综合五月婷婷| 99热综合在线| 91久久九色| 久操操| 欧美va亚洲va在线播放| 丁香五月手机在线| 午夜少妇在线观看视频| 丁香五月欧美| 丁香六月av| 麻豆精品| 激情五月婷婷| 色情成人五月天| www.天天色综合| 影音先锋女人AA鲁色资源| 婷婷五月天干干| 激情五月丁香婷婷| 中文av网站| 婷婷丁香77777| 国产精品汇聚精彩第二页 - 高清完整版在线 - 青蛙AV | 91精品婷婷国产综合 | 91干网| 亚洲久热| 操逼巨乳91| 操操操操操操婷婷五月天| 免费播放AV| 亚洲五月天激情| 狠狠穞A片一區二區三區| 综合激情五月四射婷婷| av免费在线网站| 成人无码精品1区2区3区免费看| 97操碰碰无码视频| 丁香九月婷婷色| 婷婷五月天改成什么了| 亚洲操B视频| 狠狠五月婷婷| 色综合色色| 丁香五月六月综合欧美| 五月婷婷色吧!| 99er这里只有精品| 五月婷中文字幕| 人妻六月天| 五月丁香久久久| 五月丁香婷婷啪啪| 九九Av| 婷婷婷婷婷婷婷婷| 天天日天天做天天操| 99色区| 第四色激情网| 亚洲色色五月天| 丁香五月婷婷少妇| 激情 久久 婷婷| 97碰超级人人看| 91视频综合网| 婷婷五月天高清无码| 这里只有精品在线免费视频| 久久狠狠高潮亚洲精品 天天摸夜夜摸夜夜狠狠摸| 狠狠色噜噜狠狠| 日韩久久日| 狠狠色 综合色区| 激情久久久| 婷婷五月综合欧美在线播放| 九九色热| www.91久久| 色色色五月婷婷| 丁香九九九九| 婷婷色五月激情| 九热免费视频| 丁香色五月 97干| 强伦轩人妻一区二区电影| 热99免费在线| 婷婷色在线视频| 亚洲成人无码网站| 亚洲碰碰碰| 婷婷狠狠香蕉综合| 五月丁香六月停停停| 六月丁香啪啪| 色噜噜狠狠色综无码久久合欧美| 五月天激情小说| 日韩艹比| 99视频在线9| 激情婷婷22月间| 激情五月天色色色| 久久久jd| aa久久| 日日操夜夜操狠狠操| 婷婷五月天免费小说| 九月婷婷综合八月丁香在线观看| 立川无码av| 激情激情激情网| 色欲资源网| 99久热| 国产 亚洲 在线| 婷婷视频网| 99精品成人无码A片观看金桔| 色哟呦av| 婷婷五月激情综合啪啪| 激情五月婷| 色五月天.con| 99热这里只有精品2016| 婷婷五月天免费| 99色在线| 操一操干一干| 另类五月激情| 99热99| 丁香五月,开心五月,成人婷婷| 欧洲激情网站| 婷婷五月激情在线视频| 精品人妻伦一二三区久久| 婷婷永久在线| 久久久国产精品黄毛片| 久re在线| 91久久久久久| 天天爽日日爽夜夜爽| 停停五月色宗合| 五月丁香猫咪久久婷婷综合视频激情四射网入口 | 91人在线观看| 久久999久久999久久999久久| 婷婷综合久久| 青草青青草| 狠狠干婷婷| 丁香婷婷老司机久操| 色婷婷影视| 久久这里有精品视频| 大香蕉九九| 九九综合九色欧美狠狠| 噜噜噜狠狠色综合| 操操操AV| 99精品在线播放| 99se丁香| 九九五月天| 日日日日操| 丁香五月av| 欧美婷婷丁香社区在线播放| 91视频一起草| 激情婷婷五月色| 久热久| 丁香色婷婷五月天| 亚洲精品色| 97婷婷久久丁香| 色色五月天婷婷| 噜噜久| 婷婷五月天社区| 国产人妻777人伦精品HD| 激情骚五月| 婷婷成人综合五月| 五月天 另类图片| 欧美在线视频99| 热久久91| 91精品综合久久久久久五月丁香| 国产成人精品一区二三区熟女在线 | 4399在线观看免费高清黄色视频| 色欲日日躁| 婷婷的久久网站| 九九九九中文字幕| 婷婷色5月天在线。| 激情五月天色网站| 9精品一区| 丁香婷婷五月六月天| 中文字幕在线免费| 日韩久综合| 日屌日日操日日色| 国产真人做爰视频免费| 欧洲永久精品| 亚洲综合视频网| 三级99热| 日日操天天| 七月丁香五月婷婷在线| 思恩热国产视频右线观看| 99爽视频| 国内久久久精品99| 五月婷婷真爱激情网| 梁铮版蜘蛛女在线观看| 精品久久99码| 丁香六月亚洲| 五月婷婷自拍视频| 婷婷最新地址| 91热er| 国产偷人爽久久久久久老妇APP| 丁香五月婷婷激情网| 在线观看亚洲视频影院| 97在线日本| 99爱精品| 久久99久久久久久久噜噜| 五月成人综合| 日本色婷婷| 六月丁香射婷婷欧美色图片| 久9视频| 亚洲色婷婷| 女人天堂AV| 国产免费一区二区在线A片视频| 婷婷五月综合社区| 婷婷久久性爱| 久久久久9| 激情综合网五月婷婷| 久久婷婷伊人| 99热在这里只有免费精品| a久久| 婷婷伊人激情婷婷| 久久AAAA片一区二区| 婷婷综合激情五月综合| 91夫妻视频| 天天爽天天做| 亚洲AV永久无码影院黑人| 六月激情综合| 亚洲综合99| 另类小说色婷婷| 天天干夜夜b| 日本女色人人| 五月色婷婷综合| 偷拍91九色| 高清无码入口| 亚洲激情亚洲激情 | 狠狠色噜噜狠| 婷婷丁香18| 亚洲精品国产成人AV在线| 国产精品色色| 五月丁香欧美在线| 天堂爱啪啪| 婷婷五月天伊人| 丁香五月天无码| 久久 中文 日本| 婷婷射综合| 婷婷久久免费看| 97色射| 香蕉狠狠爱视频| 噜噜综合网| 亚洲AV日韩在线观看| 五月丁香亭亭| 天天做天天要天天爱| 日韩国产在线精品| yazhochengrenavwang| 激情五月婷| 丁香五月天婷婷在线视频| .精品久久久麻豆国产精品| 色在线视频网2025| 色婷婷久久综合久色综| 成人午夜视频精品一区| av人人干| 五月丁香日本片| 亚洲色区17| 九九久久精品| 狠狠激情五月天| 超碰成人在线观看| 久久九久久| 婷婷丁香六月| 99久久精品视频女神1| 超碰com| 国产成人精品一区二区三区视频 | 日本欧美国产| 日本eVa一区=区视频| 婷婷综合五月天| 欧洲亚洲欧洲99久久| 永久免费视频| 日韩AV中文在线观看| 综合视频久久| 五月天激情AAAA| 九色PORNY9l原创自拍| wwww.9免费视频| 综合色色色| 国产精品美女| 97色色色色色色色色色色色色色| 丁香久久综合| 综合久久综合五月天婷婷| 五月丁香久久网| 天天日夜夜拍| 嫩草AV久久伊人妇女超级A| 久久的爱大香蕉| 五月婷婷视频| 亚洲五月花| www,色婷婷| 天天色天天爱天天爽| 久久亚洲婷婷综合色五月| 欧美色色色色色色色色色色| 亚洲精品国产A久久久久久| 91超级碰| 日本色爽| 久久色五月天综合网| 开心四月婷婷在线色播播| 91综合色| 九月丁香八月婷婷久久综合久97| 双性美人被调教到喷水A片| 99碰碰| 激情五月婷| 少妇达人正片在线播放_ikun_福利吧| 丁香五月激情月| 久久草大香蕉| 色综合久久天天综合网| 亚洲在线视频321| 九九色婷| 操碰色一区就去操| 五月色网| 五月婷婷之综合激情| 日本久久婷| 五月婷婷激情网| 婷婷五月无码| 99re思思久久| 天天夜夜六月丁香五月婷婷老师| 丁香五月激情站| 五月天激情综合首页| 色婷婷视频| 91五月天| 成人片在线播放| 五月丁香综合| 五月天色婷婷综合| 久久婷婷五月天懂色| 欧美 日韩 成人 在线| 99看片| 九九这里只有精品| 99综合网| 久久视频婷婷| 久久婷婷人人| 亚洲色婷婷视频| 久久色五月天激情小说| 无码任你操| 99热.com| 热久久这里只有精品| 超碰a女人的天堂| pom538精品视频| 精品国产va久久久| 91性高潮久久久久久久久| 五月天婷婷丁香导航| 婷婷五月天综合久久| 天天日天天干天天天| 欧美婷婷综合| 日本99在线视频| 丁香五月婷婷色情综合| 亚洲成人综合在线| 天天色播| 欧美性爱五月天| 欧美槡BBBB槡BBB少妇| 人妻有码乱操| 91色欲综合| 91丨九色丨熟女| 婷婷丁香熟妇综合网| 婷婷激情五月天网站| 色婷五月天网站| 日韩十国产极品久久| 婷婷成人五月天| 婷婷大香蕉| 日本久久网| 超级碰碰99| 久久综合无| 天天爽爽日日做做| 色大综合| 99亚洲精品| 玖玖资源在线视频| 超碰国产在线播放| 久久sp免费视频| 日韩在线视频中文字幕| 亚洲性图一区二区三区| 婷婷六月激情丁香| 日日杆天天| 日本狠狠干| 狠狠ri| 开心五月婷婷婷美女| 五月丁香爱婷婷深深| 久久99热 这里有精品| 狠狠干五月天| 欧美日韩999| 亚洲AV激情五月综合网| 99热99热在线| 狠狠五月天| 99热人人艹| 国产激情视频在线观看| 99re思思精品在线观看| 五月天狠狠| 超碰免费在线| 久久999久久999久久999久久| 日本三级大片| 五月天伊人综合| 久青草影院| 综久久久| 五月开心六月婷婷在线播放网站| 日本五月天激情| 人妻av在线| 激情九月天天天天婷婷| 久热大香蕉| 国产精品久久久丁香五月八戒视频| 热久国产| 激情小说视频图片| AVV黄| 天色综合网站| 色99网| 天天色播| 4399亚洲视频| xxx.色婷婷| av九九| 婷婷无码视频| 五月亚洲| 欧美丰满熟妇BBB久久久| 91要啪| 色五月丁香五月天| 97色婷婷| 五月天成人综合| 99re鈥哸鈥唙| chaopengdaxiangjiao| 色五月婷婷在线| 五月婷婷在线综合| 国产AV影片| 777久久精品| 淫视馆aV二区一区| 亚洲五月激情| 丁香五月婷婷色情综合| 婷婷五月天桃花网| 深夜男女福利刺激影院一区| 亚洲va欧洲va国产va不卡| 国产成人精品一区二三区熟女在线| 97精品自拍| 婷婷五月天免费视频| 97操操网| 狠狠色情婷婷| 色狠狠综合网| 色色色五月婷| 中文av网站| 婷婷视频在线碰| 五月天婷婷色小说| 国产精品久久久久久亚洲毛片| 狠狠做五月| 久久大香蕉同僚| 久久玖玖综合| 激情綜合W W W,激情五月天| 国产又爽又猛又粗的视频A片| 欧美狠狠一在草| 人妻22p| 日本一级黄色电影| 久久激情五月天| 日本精品干| 九九热这里只有精品6| 人妻在线观看视频| 久久机热思思热| 久久九九国产精品怡红院| 久久精典| 亚洲色婷婷| 91久久18| 99爱在线精品视频免费观看| 天天插操| 视频色色色色色色| 激情国产综合| 黄色五月婷婷| 色婷丁香| 91碰碰|