免费国产精品自在自线-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
返回資訊列表
99ri国产精品| 永久天堂日本| 一本伊人色婷| 色欲婷婷五月天| 五月激情天| 五月丁香六月婷婷久久久综合| 91日综合欧美| 国产五月视频| 色五月激情五月| 五月激情婷婷女| 九洲一级A片| 日本女天天爽| 性色av大香综合| 99热精品免费| 九九热在线视频| 五月天婷婷爱| 伊人五月天婷婷| 五月天色播网| 激情婷婷内射| 噜综合| www.99操.com| 综合色七七| 久久资源网五月婷| 免费啪啪亚州视频| 色色色99| 国产无套精品一区二区| 五月婷婷六月丁香| 熟女激情五月天| 色婷婷五月视频| 26uuu四色| www.久久爱.c n| 91男同视频| 91成人性爱视频| 色婷婷精品视频| 精品一区二区三区木瓜| 先锋资源 996| 开心激情网五月| 天天草天天舔| 色狠狠综合网| 久草xx性爱视频| 五月色丁香国产在线视频| 色色日韩| 99久久成人| 狠狠香婷婷五月| www.99热视频| 激情网五夜婷婷| 亚洲无码成人| 欧洲永久精品| 婷婷一本和五月丁香| 五月婷婷五月丁香综合| 亚洲 在线 性爱| 激情小说五月天社区丁香| 综合色网站| 成人短视频免费观看| 久久ri精品视频| 亚洲成人日韩无码精品| 久婷自拍视频| 高清视频一区| WWW.激情| 狠狠搞亚洲| 蜜桃五月天| 五月婷导航| 五月婷婷激情综合拍| 国产综合激情五月久久| 婷婷六月激情在线视频| 日本99在线视频| 色情久久久| 五月婷婷人人人操| 色色色综合| 久草热8精品视频在线观看| 99精品国产乱码久久久人妻| 久久99免费视频网站| 99久久婷婷国产综合精品| 大伊香蕉精品视频在线| 性爱五月婷婷| 激情综合青草| 天天透天天爱| 丁香五月激情五月| 婷婷狠狠爱| 二级黄色毛片| 久久99热这里只有精品23| 色噜噜狠狠色综合AV兰草影视| 美臀自射自家人妻| 另类激情综合| 亚洲成av人影院| Www.久久| 狠狠色五月激情| 激情综合五月色在线| 91视屏在线观看com.wwwvv| 丁香五月激情六月综合| 91狠狠综合久久久| 玖玖九九9999在线观看视频精品| 丁香五月激情宗合网| 激情婷婷综合| 狠狠爱婷婷| 婷婷五月在线观看| a色婷婷| 色愛综合网| 射久久丁香五月| 狠狠色五月天| 丁香八月综合激情| 天干天天干天天天天天| 激情视频网址| 久久综合网桃花| 99热99在线| 激情五月深爱婷婷| 搡BBBB搡BBB搡五十| 日韩精品电影| 久久激情五月网| 另类精品视频在线观看| 91色碰| 亭亭五月丁香综合欧美| 成人短视频在线免费观看| 99热这里| 色播五月丁香| 婷婷五月激情欧美| 六月婷色| 思思热精品在线| 女人天堂AV| 亚洲国产黄色电影| 丁香婷婷成人在线播放| 影音先锋91网站在线观看| www.91在线观看| 美女激情婷婷| 国产肥白大熟妇BBBB视频| 99热在线精品播放| 日本一级特黄大片AAAAA级| 久久精品一区二区三区四区| 婷婷五月天Av| 大地资源色婷婷视频在线| 操人久久| 91九色无码日韩| 夜夜嗨一区二区三区直播内容| 无码啪啪| 五月激情在线| 秋霞学生妹一二级| 五月天婷婷基地| 视频1区2区| 色狠狠色狠狠| 99久久婷婷国产综合精品电影| 一夜福利不卡| 午夜成人片400| 五月天激情图片| 岛国av网站| 99色人| 久久五月天精品视频| 99熟女啪啪视频| 97碰 在线视频观看| 久久这有这里精品| 五月天激情国产综合婷婷婷| 六月丁香射婷婷欧美色图片| 成人超碰网| 日韩草草草草草草草草草草草草| 91色呦哟| 婷婷伊人网| 超碰av天堂| 日本狠狠网| 色99xx| 开心激情播播五月天| 久久综合五月情| 日日操日日射| 伊人五月综合网| 激情丁香六月| 91色在线/日韩| 久操热线| 五月丁香直播| 色色网91| 激情综合久久| www,五月丁,com| 婷婷综合中文| 欧美精产国品一二三区| 夜夜爽天天| 日日干日日| 深爱网深爱综合网| 三级99热| www.激情| 99久久玖玖| 亚洲成人网站在线| 欧美大肥婆大肥BBBBB| 婷婷 久综合| 99视频自拍| 婷婷色香六月综合激情| 色色色五月婷| av国产精品| 狠狠色婷婷777| 丁香六月婷婷开心婷婷网| 丁香五月影院| 天天操天天操| WWW99热| 欧美色婷婷| 五月婷婷激情色情网| 禁片二区| 综合色99| 色噜噜狠噜噜视频| www 五月天 com| 操婷婷基地| 玖玖婷婷五月天| 天天草天天爱| 色婷婷伊人| 五月天色五月| 伊人色综合久久久| 国产精品A片| 丁香五月先锋| 黄色成人AV在线| 激情五月六月婷婷| 99re在线视频| 五月五婷婷| 激情五月天色| 超碰女人天堂| 久久天堂加勒比| 色婷婷综合网站| 噜噜精品| 久久这里有精品在线观看| 婷婷五月色图| 亚洲av无码影院| 26uuu亚洲| 五月亭亭性| 丁香五月综合色婷婷| 加勒比久热| 五月婷婷丁香六月| 亚洲热视频在线| 亚城区在线| 亚洲国产精品成人免费一区久久久在线观看AAAA | 丁香五月天在线直播观看| 蜜乳人妻一区二区三区| 在线色婷婷| 久久99视频| 成人色图情色成人网 www.5b5b5bcom 五月天| 丁香五月激情婷婷激情| 国产Va视频| 丁香五月婷婷AV| 99精品久| 99丝袜精品视频网站| 天堂成人A片永久免费网站| 丁香激情四射| 婷婷人人操| 亚洲精品大片| 99综合网| www.久久爱.com| 色色哒五月婷婷六月丁香| 99 色色吧| 看婷婷五月天网| 婷婷五月天大香蕉| 99欧州偷拍视频| 九九精品系列| 五月丁香久久呀| 99碰在线视频| 婷婷五月天AV在线| 成人在线网址| 色五月婷婷久久爱| 丁香婷婷五月天色播| 色丁香五月天射婷婷爱婷婷| 五月激情丁香六月狠狠干| 在线中文字幕视频| 丁香六月婷婷缴情欧美| 天天日人人| 国产在线6| 天天爽夜夜爽夜夜爽精| 天天综合色综合| 欧美天天综合网站上去吧| 99热色无码| 日韩成人无码人妻| 激情五月丁香综合蜜桃| 天天操夜夜玩!| 激情五月综合色婷婷| 久久久er热| 久久在这里有精品| 色婷婷AV久久久久久久| 色狠狠999综合| 五月丁香激情综合| av一级棒av| 欧美 色婷婷| 丁香五月 性爱| 久久久久久9热不雅视频| 色婷婷亚洲综合网站| www.婷婷五月.com| 欧美99热| 天天夜夜操| 十月色综合| 五月丁香综合激情| 天天综合精品| 91伦| www.日本久久videos| 色婷婷狠狠干| 精品人妻久久久久久| 超碰爱爱爱| 婷婷五月av| 色播丁香| 最新AV在线观看| 91精品久久久久久久| 婷婷激情五月天网站| 99精品视频在线| 另类综合婷婷五月天欧美视频| 色婷婷五月天在线观看| 熟妇内谢69XXXXXA片| www.久操| 视频免费精品免费精品免费精品免费精品免费精品免费精品免费99 | 九九精品综合| 九月丁香婷婷网| 黄色一级影片| 五月婷婷激情69| 97干综合网| 99热啪啪| 色五月婷婷操逼| 九九热九九| 黄色激情五月天| 久久九九热视频| 婷婷中文字幕欧美| 99 频99热国里只有精品| 99A片| 色情五月丁香| 9久热免费视频99| 五丁香激情综合| 五月婷婷成人| 不卡成人免费| 丁香五月婷婷88在线| 欧美大香蕉视频| 疯狂做受XXXX高潮A片| 激情五月色婷婷| AⅤ色区| 99在线视频播放| 色五月天激情| 激情五月天婷婷| 伊人无码高清| 国产99热| 超碰在线观看9| 天天碰夜夜操| 婷婷五日b| 久久婷婷五月丁香网| av在线免费播放观看| 色婷婷狠狠| 亚洲色五月婷婷| 日本精品人妻无码77777| 丁香五月色五月| 欧洲亚洲激情五月天在线| 丁香婷婷社区| 天天射影| 综合五月婷婷| 开心深爱五月天| 中文字幕AV在线| 久久人视频| 婷婷丁香综合成人| 91av视频| 五月激情婷婷在线| 五月天丁香看婷婷| 久久婷婷六月综合| 性爱网六月丁香| 五月开心激情网| 熟妇人妻中文字幕无码老熟妇| 丁香五月综合| 五月婷婷成人| 九九sese| 精品夜夜澡人妻无码AV| 亚洲五月天综合| 国产成人网址| www色婷婷久久综合久色| 草草视频91| 99日在线视频| 色播播五月天| 岛国av网| 67194中文在线| 久久久久99精品成人片| 亚洲综合色激情色五月| 五月婷婷开心综合| 先锋资源婷婷| 婷婷伊人綜合中文字幕小说| 国产1区2区3区在线观| 夜夜操天天干| 色五月婷婷五月久久| 人妻丰满精品一区二区A片| 九九色综合| 综合久久99| 婷婷的激情五月| 久久婷婷亚洲| 亚洲国产精品综合色区| 大香蕉七区| 免费观看大片视频 丁香婷婷 六月欧美| 月色色综合婷婷网| 久99久在线| 五月天激情黄色小说在线观看| 亚洲热视频在线| 97五月天婷婷午夜| 啪啪九九色| 狠狠色大香蕉| 美臀自射自家人妻| 夫妻超碰在线| 色婷婷丁香五月| 狠狠狠狠狠狠狠狠草| 九九艹女| 婷婷五月色播放| 久色视频首页| av成人在线播放| 综合啪啪| 日本性视频| 六月婷婷九月丁香亚洲综合| 亚洲AV综合在线观看 | 久久婷婷精品| 天天色综合网吨吧| 久久激情视频| 五月婷婷亚洲综合在线 | 久久超级碰视频| 操操啪| 激情纯色婷婷五月天在线不卡视频| 高清a片基地| 五月天丁香成人社| 亚洲国产成人裸舞| 99久久九九| 婷婷丁香红五月91C| 99精品综合| 婷婷六月色丁香视频在线观看| 亚洲天堂制| 色婷婷丁香五月| 都市激情五月婷婷亚洲| 性爱动图国产麻豆一区二区三区 | 9久久网| 五月丁香婷婷基地| 亚洲天堂aaaa| 亚洲精品五月| 亚洲丁香婷婷五月天综合色| 色色狼人综合| 亚洲蜜乳AV| 99综合网| 五月婷婷天| 色五月婷婷很很操| 99热这里只有精品50| 亚洲av综合网| 大香蕉五月| 美女要搞搞天天搞搞搞网站| 国产综合色婷婷精品久久| 亚洲春色奇米影视| 激情婷婷五月天| AV网站免费在线| 色五月婷婷内射| 五月婷婷成人网首页| 色噜噜狠狠色综合成人99| 久久婷婷五月综合色丁香花| 亚洲乱码日产精品BD| 五月天大香蕉| 婷婷性爱影院| 99热这里都是精品| 狼友视频在线观看18| 天天干天天操天天拍| 人妻久久久久久久久妻久久久久| 99极品视频| 在线99热| 婷婷五月天受日本法律保护| 金桔一区二区ab地址| 综合99视频| 亚洲99一级无嗎特制在线| 精国产品一区二区三区A片| 99久久九九| 干一干xxxx| 狠狠色成人影片| 色爱五月天| Www.激情| 婷婷色操| 久久三级视频| 婷婷大香蕉| 色香蕉影院| 五月婷婷激情| 国产熟妇的荡欲午夜视频| 久久久网站| 91日韩在线| www.yw尤物| 精品一二三区久久AAA片| 九九综合| 欧美午夜乱妇午夜福利| 4438全国最大视频成人网站在线观看| 久人人操| 99综合视频一体| 69久久99精品久久久久婷婷| 激情av| 五月丁香| 成人国产欧美大片一区| 性爱激情久久| 国产日韩av片| 色亚洲无码| 九九这里有精品视频| 丁香成人综合| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 成人网站av免费网站推荐| 99热只有精品在线| 色五月综合| 激情五月天综合网站网站网站| 在线,国产,色,热视频| 丁香五月成人论坛| 日本色色视频| 五月天天天色| 色操综合| 婷色五月| 五月丁香花婷婷玉莉AV| 射区导航| 丰满人妻妇伦又伦精品国产| 久9草在线观看视频| 91日韩美女被插视频| 丁香婷婷五月激情| 五月天伊人手机在线播放AV| 激情久久久久久久久久| 成人精品视频99在线观看免费| 2025神马午夜福利| 99久在线精品| 久久99免费视频网站| 亚洲国产网址| 色色色色色级无码| 亚洲丁香婷婷丁香五月天激情| 亚洲1区| 日本三级成人秘书精品片| 九九精品婷| 五月丁香综合激情| 激情五月天小说|五月天开心激情网|亚洲精品国产自在现线|黄色五月天 | 六月激情丁香一道本7777| 日本操碰碰| 五月婷婷黄色视频| 色婷婷小说| 人五月天婷婷喷水| 性色欲情 网站| 婷婷丁香五月,狠狠综合| 亚洲熟妇无码乱子AV电影| 久久香蕉网| 激情伊人网| 婷婷五月天无码视频| 丁香五月婷婷六月丁香| 日韩成人影片网站| aⅤ79成人片| 丁香婷婷深情五月亚洲| 国产全是老熟女太爽了| 五月丁香六月婷综合成人综合| 丁香婷婷色五月天| 粉嫩AV久久一区二区三区| 欧美人人女女精品综合五月天| 欧美成人热| 久久多色| 99手机在线精品视频| 操一操| 激情综合网五月激情| 四色五月视频| 激情婷婷综合五月少妇| 无遮挡国产高潮视频免费观看| 91肏| 五月天激情小说网| 婷婷久久色| 巴基斯坦粉嫰无码视频| 91超碰人人操| 快乐激情五月色婷婷| 男女免费视频999| 精品AV无码超碰| 丁香五月婷婷六月婷| www.五月.com| 久久人操| 婷婷啪啪| 天天爱天天做天天日| 狼人婷婷久久| 五月色丁香| www婷婷| 97婷婷丁香五月综合| 亚洲九九99精品视频在线播放| 99久久久99久久91熟女| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 日本欧美国产| 爱操天堂| 夜丁香五月婷婷| 天天干人人奸97| 99re热久久| 538在线精品| 天天做天天双| 69天堂99| 人人操av| 9|无码久久久久久| 五月天婷婷综合网| 精品综合久久久久久五月天| 牛色色碰| 99热这里精品| 婷婷内射视频在线| 五月丁香啪啪啪| 激情五月天色| 国产AV一区二区三区日韩| 天天射射夜| 天天日色情| 色色综合色| 91性人人| 日日综合网| 婷婷五月天国产手机在线视频观看| 粉嫩AV久久一区二区三区| 狠狠肏综合网| 丁香五月伊人| 久久久久网站| 成人天天爽| 五月丁香婷婷六月天| 国产熟妇乱子伦hd| 狠狠五月天| 色婷婷综合久久久久| 婷婷亚洲综合| 九九热这里只有精品9| 操草草草| 黄色三级日本| 亚洲乱码成人| 99热99久久| 久热大香蕉| 天天干天天 亚洲| 久久九九精彩| 五月综合激情网| 天天色综合网吨吧| 五月色婷婷影院| 欧洲色区| 色婷婷久久| 丁香婷婷综合激情五月色,开心五月丁香花综合网,激情综合五月亚洲婷婷,五月天 | 婷婷丁香18| 91久久九久久九久久九久久九久久| 天天性视频| 操大屄五月天视频| 精品久久99| 狠狠狠狠狠草| 99激情网| 日逼影音先锋AV男人资源站| 九九99精品视频在线观看| 婷婷六月中文字幕| 婷婷丁香五另类网站| 欧美成人AAA片一区国产精品| 五月婷婷在线免费观看| 激情五月综合免费| 无码人妻电影| 五月色亭丁香| 狠狠色综合网| av色婷婷| 色色色免费视频| 亚洲美女婷婷五月天| 欧美碰碰| Av狠狠色丁香婷| 九九黄色网| 亚洲色模骚货| 天天日天天摸天天| 91丨九色丨大屁股| 亚洲午夜一区二区| 婷婷5月久久综合网站| 婷婷五月av| 天天爽夜夜爽夜夜爽精品视频| 狠狠另类视频| 久久五月婷婷电影| 九九人人精品| 欧美月久久| 琪琪色五月婷婷老师| 六月天婷婷| 大香蕉伊人99| 婷婷五月天情色| 国产裸舞表演WWWW| 26UUU欧美激情一区二区| 亚洲av免费在线| 久久天堂婷婷五月| 久久一伦| 婷婷综合干| 色五月丁香五| 成人国产网站在线免费看| 婷婷久久综合久| 激情综合99| 久久六月综合| SESE无码AV| 激情久久五月网| 色爱99| 九九国产精视频| 99re免费精品视频| 女同激情久久av久久| 在线成人视频免费| 91在线操| 性生活视频98791| av在线免费网站| 丁香五月婷婷亚洲激情四射| 久久色吧| 蜜臀99久久精品久久久久| 日本英国美国欧美亚洲国产精亚洲日韩精品在线观看 | 91黄色五月天视频| 超碰人人在线观看| 97成人视频| 五月色激情综合网| 亚洲无码激情| 国产精品视频免费看| 超碰不卡在线| 91爱啪啪| 成人色色综合| 五月婷在线视频免费播放| 婷婷五月天电影在线| 99亚洲色色| 综合婷婷都市激情| 玖玖爱综合网| 久热免费视频| 久久黄色片| 精品九九久久| 久久婷婷五月天激情四射| 熟女激情网| 九九精品视频免费在线| 激情五月综亚网| 日本在线噜噜| 97碰碰视频| 色五月综合网| 久久精品国产精品| 丁香六月婷婷社区| AV在线大香蕉| 天天在线久久综合 | 看全色黄大色大片| 能看的AV| 色色六月| 婷综合| 婷婷五月天激情综合| 五月婷婷我| 激情五月色婷婷| 亚洲天堂热| 97碰碰叉| 日本91在线| 另类国产综合| 男女免费视频999| 大香蕉人妻| 91seAV| 全亚洲最大的婷婷五月天网站COM| 婷婷五月天六月综合| 五月婷婷激情视频| 五月婷婷影院| 性爱五月婷婷| 五月天激情小说电影| 丁香六月情| 91热爆在线| 日本欧美啪啪| 婷婷五月欧美综合| 另类 在线| 中文成人在线| 成人五月天丁香| 色情激情五月| 九九热在线99| 五月激情综合性爱| 久久久五月激| 日本久久99| 久艹久| 久久6这里只有精品| 九九热在线精品视频| 亚洲精品国产熟女久久久| 黑人无码一区| 伊人深爱综合| 免费视频无码| 91日本在线观看| 五月婷婷激情综合网 | 亚洲精品无码A片一区二区| 久久三级视频| 另类激情五月在线视频欧美| 玖玖色综合色| va中文资源在线观看| 激情六月天婷婷| 丁J香六月首页| 午夜 外网 精品 在线| 婷婷伊人久久| 丁香五月电影院在线观看| 久色网五月| 亚洲人妻av| 97操在线视频| 99热这里都是精品| 婷婷中文字幕在线| 亚洲色激情| 曰韩五月丁香色婷婷无码| 操操操www.com| 婷婷99中文字幕| 影音先锋偷偷色男人站| 狠狠狠夜夜夜| 91九色 熟| 蜜乳国产网站| 五月Huangsewang| 丁香月五月天婷婷久久| 99在线免费视频| 久热9| 人人操99| 91人人爽狠狠狠| 五月婷精品| 97碰| 九九综合九九| 五月丁香精品| 久久婷婷热| 51成人| 丁香五月影院| 色五月婷婷中文字幕在线观看| 91一起艹| 久久综合这里只有精品1| 99啪啪视频| 97精品综合久久| 丁香六月婷婷久久综合| www久久99com| 国产欧美精品AAAAAA片| 99热这里只有精品69| 秋霞少妇AV网站| 97好吊操| 五月五月婷婷| 久久九区| 这里只有精9| 欧美怡红院黄站| 可以直接看的AV网站| 久久丁香婷| 五月开心久久| 色V狠狠的干| 五月天六月色| 婷婷播播五月天| 日韩AV成人电影| 久久精品性爱| 久色网| AV网站免费在线| 97色综合| 激情com| 日本强伦片中文字幕免费看| 六月亭亭久久综合激情| 婷五月天| www99热| 这里只有精品日韩精品| 亚洲AV日韩在线观看| 亚洲激情婷婷| 丁香综合婷婷开心激情网| 99热在线观看| 色导航色婷婷五月天在线观看| 色色五月天婷婷丁香| 大香蕉人妻| 日日天天操| 五月丁香婷婷老司机| 丁香婷婷色| 五月香蕉婷婷| www.久久9| 噜噜在线| 操人妻视频91| 婷婷六月丁香激情| 天啪天啪天啪天啪| 欧美在线视频99| www.六月丁香看AV| 玖玖综合色| 久久婷婷五月天大香蕉| 一区二区免费看| 日韩无码人妻一区二区三区综合 | 久久九九经典| 亚洲色另类| 激情五月天在线视频| 91五月天| 色444综合网| 超碰免费人人| 99色| 色色亚卅| 六月婷婷激情图片| 日日操夜夜操中国无码| 天天干天天干天天| 亚洲国产精品VA在线看黑人| 婷婷色5月天在线。| 99五月婷| 67194中文在线| 九九色热| 色婷婷导航| WWW,五月| 五月天综合区| 看婷婷五月天网| 影音先锋 一区| 狠狠色噜噜狠| 99无码| 国产免费一区二区三州老师F1F1| 丁香5月婷婷| 五月丁香综合激情| 综合激情深爱| 色婷婷婷综合五月天| 六月99天天婷婷激情综合| 色五月美女| 国产亚洲精品AAAAAAA片| 久久色天堂| 思思热久热| 影音先锋 婷婷| 天天操天天日天天爱| 日91高清无玛| 九九99九九精品视频| 少妇高潮呻吟A片免费看软件 | 激情婷婷九月| 91热在线观看视频| 免费黄网不卡AV| 婷婷激情五月综合| 五月激情婷婷在线| 大香蕉久久久久| 五月天.com| www.五月瑟| 婷婷丁香激情| 国产熟女日日骚五月丁香爱| 国产日批视频| 狠狠艹狠狠艹| 激情深愛五月視頻| 婷婷丁香社区网| 九九Av| 成人五月丁香社区| 激情五月婷| 香蕉操亚洲| 秋霞A V毛片| 国産精品| 玖玖色综合网| AV中文在线| 六月99天天婷婷激情综合| 色婷婷狠狠爱| 玖玖在线视频| 九九人妻福利| www.99热国产| www.五月激情红色| 99热色在线精品| 激情五月四色| 青青草五月天| 日韩99视频| 色综合色五月| 五月丁香六月欧美综合网站| 婷婷五月天av| 午夜无码熟熟妇丰满人妻| WWW.久久.COM| 97干在线免费| 久久色五月天| 久久婷色| 99热在这里只有免费精品| 丁香五月婷婷成人色区| 婷婷网五月| 久久婷婷综合五月天| 日本美女五月天| 欧美六月| 五月婷婷深深爱| 97色精品视频| 91艹人| 五月色在线| www.操逼comm| 色五月婷婷一二| 日韩999| 欧美大肥婆大肥BBBBB| 五月婷婷亚洲天堂97色婷婷| 综合婷| 亚洲超碰在线| 操逼123网| 丁香六月激情国产| 久9热| 国产人妻777人伦精品HD| 欧美日韩精品一区二区三区钱| 久久九九国产| 亚洲性爱99| av操一操| 日日操夜夜撸| 大香蕉视频婷| 色婷婷影视| 思思热久久爱| 色色五月天激情| 激情涩播| 婷婷丁香五另类网站| 狠狠爱五月婷婷综合六月| 一区二区三区XXXXXX| 99久久免费性爱视频`| 亚洲一区二区无码蜜乳av| 啪啪综合| 五月婷婷亚洲天堂97色婷婷| 丁香婷婷五月色成人网站| 天天插天天草人人玩| 婷婷五月色天| 亚洲乱码日产精品BD| 激情视频综合| 天天久久综合| 久久婷婷五月天懂色| 久久婷婷免费| 操操操操操操婷婷五月天| 逼里香不卡| 五月丁香婷婷啪啪| 六月婷婷网| 99色播| 五月丁香啪啪网| 超碰免费观看| 婷婷色色狠狠| 91狠狠综合网| AV网在线观看| 激情五月天之五月婷婷| 99re热在线视频| 大香人妻| 婷婷五月天激情综合深爱| 色欲久久综合| 欧美成人日韩| 婷婷五月天综合中文| 激情六月天| 99精品在线观看视频| 丁香婷婷十月| 婷婷综合五月天| www色五月| 亚洲五月停停| 婷婷激情六月中文| 色综合色综合色综合高潮| 久久HD| 996精品热视频| 色停停五月天| 亚洲丁香花五月丁香花| 就99这里只有精品| 色婷婷五月天偷拍| 色播婷婷大香蕉| 色婷婷六月天| 91亚洲免费片| 亚洲色色香蕉| a性生活久久无| 色丁香在线视频| 狠狠爱综合网| 婷婷激情五月天综合| 99精品在线| 激情久久综合| 色欲天天综合| 9久久婷婷国产综合精品性色| 五月丁香六月色| 色五月婷婷影视| 天天爽天天摸人妻综合网| 久久久久久99日本| 我要看激情五月天| 91精品久久久久久久久久| 国产Va视频| 亚洲日韩一页精品发布| 91操色| 国外亚洲成AV人片在线观看| 人人摸人人操人人爱| 狠狠操天天操| 内射爽无广熟女亚洲| caopeng超碰| 精品人妻伦九区久久AAA片| 二人电影免费版在线观看| 色色丁香| 情五月亚洲婷婷| 国产午夜精品一区二区三区四区| 人人天堂操| 色香蕉婷婷| 99久久玖玖| 九九色院| 久久综合中文| 开心五月天私房婷婷| 精品久久99| 丁香五月激情站| 人人操人人妻| 99热这里只有精品在线| 婷婷九月亚洲| 丁香五月偷拍| 欧洲日韩一区二区三区| 国产精女同一区二区三区久| 五月丁香六月激情欧美综合| 激情九月天天天天婷婷| 丝袜大香蕉| 久久国产精品乱子伦_靑青草…| 国产AV一区二区三区最新精品| 久久这里只有精品无码| 毛片九九九九九九| 99九九在线精品热动漫| 丁香婷婷激情综合五月激情| 99网| 怡红院视频| 99自拍视频网站| 精品久久99| 丁香婷婷成人在线播放| 五月婷婷婷| 开心婷婷五月| 人妻久久久久久久久久| 色噜噜五月天| 九九这里只有精品| 天天成人丁香美女AV| 婷婷五月天AV在| 亚洲a色| 久久婷婷在线| 久久最新色| 五月天色综合| 五月色影院| 99热99ai| 一级韩国产精品毛| 这里只有精品免费| 色色综合视频| 91九色精品熟女内射| 婷婷五月天免费99| 超碰免费人妻| 五月丁香六月婷婷亚洲| www99久久| 人妻丰满精品一区二区A片| 激情六月丁| 综合久色五月| 狠狠色丁香婷婷久久综合| 色婷婷九月| 99精品性爱| 久久黄色网扯| 人人操女人| 色伦专区97中文字幕| 激情久久久久久久久| 五月丁香六月婷婷不卡免费无码| 日本黄色在线观看| 超碰成人公开| 精品久热| 婷婷色正月| 色婷婷激情小说网| 欧美 日韩 成人 在线| 大香蕉综合视频在线| 欧美色图天堂网| 激情综合色播| 成人网站免费sxj| 国产激情视频在线观看| 超碰人人操人人9| 欧美综合婷婷欧美综| 色婷婷五月在线| 任你干线上免费视频有3吗| 在线只有精品| 亚洲视频五区| 婷婷五月天综合在线| 婷婷深爱五月亚洲综合| 97久久视频| 九热电影av| 女同在线9| 99热精品在线在线| 婷婷激情综合网| 五月天婷婷久久| 99热99热不卡| ss99热| 天天搞夜夜六| 9色在线| 美女激情综合| 日亚二欧美| 久热天堂| 婷婷WWW久久| 97大香蕉五月天| 国产欧美熟妇另类久久久| 久久久精品人妻| 久草A片| 丰满人妻一区二区三区| 色五月六月| 色五月丁香五月婷婷五月成人网| 午夜九九电影| 色青青五月| 丁香狠狠| 99爱免费在线观看| 色播五月婷婷综合| 亚洲婷婷丁香五月在线| 99色色热热| 久久婷婷亚洲| 99精品自拍| 亚洲午夜av| 狠狠干狠狠色| 成人看片网站| 5月激情天| www.狠狠操.co m| 丁香丁香激情网| 狠狠 婷婷| 婷婷五月天综合蜜桃| 蜜乳A√| 五月丁香六月婷婷在线播放| 五月婷婷在线网站| 天天透天天摸天天舔| 99色播| 五月之婷婷| 久久人妻伦理| 天天爽天天干| 欧美性爱中文字幕| 日本精品99| 天天爽天天干| 免费看欧美成人A片无码| 色www久视频| 欧美色必爱| av最新在线| 色V狠狠的干| 丁香六月婷婷综合色| 插少妇综合网| 色五月婷婷内射| 99精品在线观看| 狠狠色婷婷7777久| 99精品久久| 色狠狠婷婷| 婷婷狠狠97| 啪啪91| 婷婷丁香视频| 夜夜操夜夜操| 新97人人上人人| 少妇大叫太大太粗太爽了A片| .青娱乐天天操B| 久久99免费视屏| 超碰成人在线观看| www.minyis.com【JT】实力收量可预付TG@LXSPSW8 | www,婷婷五月天777me,com| 国产精品热搜丁香五月婷婷| 五月丁香六月婷婷激情网| 99热啪啪| 激情五月婷婷| 日本情色一区二区| 婷婷久久综合久| 99.色| 免费视频无码| 婷婷五月天社区| 亚洲欧洲小视频9| 婷婷色婷婷亚洲成人| www.热99热| 五月丁香婷草| 亚洲国产精品SUV| 婷婷久久图片| 人人爱干人人爱草| 色综合射婷婷| 99无码视频| 五月丁香婷婷狠狠操| 久久99久久99精品免视看婷| 综合网网欲色| 任你艹| 99久久九九视频| 色色色在线观看| 情情五月天色| av在线激情| 丁香五月婷婷欧美性爱| 99激情网| 丁香色五月婷婷91桃色| 丁香婷婷啪啪| 超碰2021| 欧韩性爱| 国产毛片精品一区二区色欲黄A片| 丁香六月婷婷综合| 欧美日韩国产一区二区| 五月婷婷六月激情在线| 99超级碰碰| 桃色五月婷婷| 99色区| 影音先锋91资源站| 狠狠色综合五月人人| 99综合视频| 色婷婷色99国产综合精品| 国产做A爰片毛片A片美国| 91丨九色丨白浆| 婷婷综合爱| 99免费在线视频| 久婷| jiZZdr| 亞洲自怕| 五月婷婷六月丁香激情综合网| 91久久综合亚洲鲁鲁五月天| 国产AV成人精品| 免费99情趣网视频| 丁香五月电影| 色五月婷婷AV| 深爱激情网综合| 欧美三级巜人妻互换| 色婷婷黄色网络| 综合性爱网| 婷婷五月乱交换| 九九热这里只有精品一| 99综合视频一体| 久久久999精品| 亚洲婷婷五月天| 91美女啪啪| 天天天摸夜夜夜玩| 精品国产乱码久久久久久免费| 玖热精品综合视频| 亚洲第一成人无码A片| 91pornav在线| 亚洲激情婷婷| 天天久久九九| A网在线欧洲| 影音先锋自拍网| 五月丁香婷婷成人伊人网| 日本三级大片| 久青青久| 五月天.com| 久久久com| 99热在线播放| 91丨九色丨43老版熟女| 91碰视频| 天天射综合网站| 午夜天堂啪啪| 色婷婷香蕉| 99热在线观看精品| 色综合久| 国产毛片精品一区二区色欲黄A片| 色五月婷婷av| 综合五月婷婷| 欧美天天爽| 无码色| 精品国产人人爱人人| 日本色婷婷| 无码G高清天| 色.五月综合网| 色丁香婷婷| 色婷婷五月影院| 97久久久久| 色久播播|