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
返回資訊列表
久久99久久99精品免观看软件 | 色五狠狠| 一区无码| 四虎成人精品永久免费AV九九| 色婷六月| 亚洲视频在线观看99| 农村熟妇高潮精品A片| 婷婷五月天直播| 五月丁香色停停啪啪啪| 婷综合| 九九操操| 极品五月天| 婷婷五月天综合在线| 亚洲色婷婷激情| 亚洲精品第一国产综合亚AV | 第六色在线| 亚洲狠9| 99热在线只有精品| 思思99热在线| site:jszngf.com| 99干视频| 4399精品一区二区| 99ri6在线视频| 最新久久网址| 常久最新免费的色吊丝| 五月天俺去也| 丁香五月Av| 丁香婷婷色五月| j五月香在线| 黄网免费观看| 天天操婷婷| 丁香五月花婷婷开心| 极品五月天| 亚洲色就是色色色| 99噜噜噜在线播放| 99热欧美| 色综合大香蕉| 天天操天天操天天操天天操天天操| 26uuuavcom| 殴美日韩成人| 午夜成人av在线| 97九色| 激情AV在线| 欧美性爱5月天天天看| 中文字幕综合| 色99无码| 久久 中文 日本| 亚洲激情| 96精品国产综合久久久久久| 69凹凸成人综合网| 日韩AV免费电影在线播放| 大香蕉五月天婷婷| 色啪网| 在线1青婷| 色小说婷婷五月天天天| 麻豆五月丁香婷婷| 日本天天操| 五月婷婷精品视频| 婷婷丁香五月激情中文字幕版| 婷婷在线五月天观看| 青青草原中文字幕| 婷婷五月大| 精品99在线看| 国产性爱一级| 超碰日日操| 婷婷五月无码| 丁香九月激情久久| 五月丁香花激情综合网| 综合亚洲色色| 五月丁香婷婷激情视频| 久久98| 狠狠草狠狠草| 91久久99久久91熟女精品| 丁香伊人网| 99综合视频| 欧美大片| 91色五月在线观看| 九九久久五月天综合伊人| WWW色综合| 日韩影院三级| www.五月丁香av| 伊人六月丁香婷婷| 亚洲人人操| 五月婷婷啪啪啪啪| 久久玖玖综合| 9国产在线视频| 任你艹| 国产日比| 丁香五月伊人| 亚洲有码在线视频| 人妻乱码久久久| 久久ER视频com| 99aese| 日本激情五月天‘| 青青草五月天| 人妻内射视频| 久久加勤综合| 99色激| 天天插天天干天天舔| 五月婷婷六月丁香色| 亚洲色网址| 超碰碰碰碰| 国产精品美女| 丁香五月玖玖| 99热这是里只有精品| 99爱视频在线播放| 99精品在线观看| 狠狠色丁香久久综合婷婷亚洲成人福利| 猫咪伊人久久| 色婷视频| 91中文狠狠综合| 综合五月丁香六月婷婷| 激情 婷婷 丁香五月天| 国产精品色色| 人与禽A片啪啪| 狠狠干.com| 日本三级片片| 人人操人av| 五月丁香香蕉| 色综合久久88色综合天天看| 丁香成人色情五月天| 国产欧美va| 婷婷五月激情中文字幕| www,色综合| 中文人妻主播久久| 成人AV在线电影| 久久久久久久久久久月丁| 激情 五月 婷婷 丁香| 天天做天天爱| 欧美成人AAA片一区国产精品| 91丨九色丨首页| 91久操| 色婷婷婷综合五月天| 激情综合五月婷婷六月丁香| 婷婷五月丁香五月| 久久机热这里只有精品免费视频| AV在线免费播放| 成人精品免费在线观看| www.五月天。com| 99在线精品免费视频| 亚洲AV在线免费看| 天天日夜夜夜操操操操| 农村熟妇高潮精品A片| 激情婷婷丁香五月天| 天天上天天爽| 少妇AB又爽又紧无码网站| 久热婷婷| 欧美色色色色色色色色色色| 久久久久久久,99精品视频| www.91操| 五月婷婷六月丁香在线视频免费在线观看| 超碰永久在线| 亭亭五月色男人| 婷婷五月天A V| 色情五月天首页| 亚洲色综合| 中文激情网| 天天搞天天色综合| 婷婷五月天奸女| 91久久电影| 亚洲成Av人片乱码色第1集| 五月丁香无码| 伊久大香蕉| WWW五月天| 亚洲亚洲人成综合网络| 日本va视频| 欧美性生交XXXXX无码小说| 秋霞三级色戒| 99精品视频在线观看| 中文人妻主播久久| 日本色啪| 五月天色区| 婷婷性爱视频在线| 91视频一起草| 激情婷婷五六月天| Aaa久久| 国色天香伊人狠狠色| 成人无码精品1区2区3区免费看| 无码一区二区日韩| 婷婷激情综合| 丁香五月天精品| www。久久久久一b。Cc| 五月丁香啪啪综合| www.99热视频| 99热在线观看| 亚洲性爱日韩无码| 婷婷99狠狠躁天天躁中文| 66色在线日韩| www.婷婷五月天,com| 国产精品成人AV在线| 91精品综合久久婷婷九色| 俺也去五月婷婷丁| 97色色综合| 伊人久热91| 色五月婷婷在线视频| 在线观看国产高清视频免费网站 | 久久性操| 色婷激情网| 激情网婷婷五月天| 亚洲精99| 婷婷成人在线| 免费AV播放| 六月丁香五月激情网| 玖玖婷婷五月天毛片| 欧美综合激情丁香五月六月婷| 国内一级片| 色婷婷色婷婷五月| 狠狠干婷婷| 少妇性BBB搡BBB爽爽爽视頻| 丁香激情五月| 婷婷五月天色网久| 久久五月网| 丁香五月色| 婷婷五月天黄色小说| 97人妻碰碰碰久久香蕉| 综合色、色综合| 深爱激情五月网| 色综合久| 久久婷婷五| 五月婷婷综合网| 五月丁香婷婷人体| 五月色综合网欧美网| 国产看真人毛片爱做A片| 婷婷五月天精品| 婷婷五月天最新综合你懂的| 婷婷综合另类| 91人久| 色5月丁香婷婷| 激情网五夜婷婷| 99艹精品在线观看| 人妻丰满精品一区二区A片| 996er热| 激情深爱婷婷网| 久热精品在看| 97碰碰九九视频| 91玖玖| 九九久久精品| 9999热在线观看| 狠狠狠狠狠| www色五月天| 任你操精品免费| 色狠狠综合| 色五月综合婷婷| www.91操| 91人操人人人操人| 日本在线wwww| 日日色综合| 婷婷五月激情五月激情| 青草热视频这里只有精品| 91碰视频| 任我鲁这里有精品视频| 一区中文字幕电影| 人妻中文在线| 久久99久久99精品免视看婷婷| 丁香五月亚洲| 亚洲综合激情五月| 天天色激情| 天天爱天天做天天舔| 91大神操美女| 久操激情| 日韩精品超碰在线观看| 一区二区三区四区牛| 国外亚洲成AV人片在线观看| www.丁香五月| 99精品视频网| 思思热视频在线| 2017人人操| 丁香六月色情| 开心五月婷婷五月| 国产色色在线| 多精窝99在线视频| 五月天另类综合网| 天天在线久久综合 | 99热999| 五月伊人91| 一点色成人网| 丁香婷婷成年| 啪啪啪丁香五月| 色五月丁香com| 老师的粉嫩小又紧水又多A片视频| 淫视馆aV二区一区| 丁香五月香蕉| 成人综合网站| 色综合色五月| 色婷丁香| 婷婷五月天在线观看| 9l视频自拍9l视频自拍九色学生| 97干欧美| 激情五月六月婷婷| 久久婷色| 操老逼综合网| 激情超碰网| 在线日本www| 国产乱轮一区二区三区| 热婷婷久| 玖玖爱资源站| 天天综合久久| 婷婷五月激情欧美大胆视频| 婷婷射婷婷舔| 五月天色在线| 激情五月婷婷色| 五月婷婷人妻| 人人操AV| 色色色无码| 青青草激情网| 国产伦亲子伦亲子视频观看| 好大好粗嗯啊-一级黄色大片免费观看-成人AV| 第五婷婷伊人丁香| 丁香五月花婷婷开心| 五月丁香拍拍激情综合| 国产色色色色| 亚洲色五月| 91Chinese在线| 精品人妻伦一二三区久久| 99网| 超碰京东热av男人的天堂| 九九九九中文字幕| 色五月综合激情| 婷婷五月综合啪| 久久久久久久久月丁| 婷婷丁香五月综合网| 久久亭亭电影| 激情色色| 美女妹子后射视频网站在线观看| 激情综合网址| 婷婷99狠狠躁天天久久久九九九| 99色久| 69精品人人人人| 开心五月丁香综合久久| 亚洲天堂aaaa| 91久久婷婷| 男人的天堂婷婷色五月| 色色五月丁香婷婷| 91人妻视频| 色婷婷综合网| 国产又色又爽又黄又免费| 99热最新国内| 天天做天天爱天天日| 久久九九蜜| 啪啪操超碰| 久久99热这里只频精品6学生| 91蝌蚪窝视频在线| 久操无码| 色停停五月天| www.五月天| 五月天色站| 天天爱天天日| 日韩 中文 欧美| 成人做爰A片免费看视频| 色婷婷综合在线| 激情五月天在线观看色婷婷| 丁香五月婷婷香| 六月丁香网| 综合超碰熟| 五月激情网五月综合网| 婷婷五月天影院| 五月天综合色| 色情婷婷。| 日日色五月天| 91viP在线看| 一本婷婷丁香久久| 丁香五月日啪| 激情色色色| 九九激情| 一级A片天天操夜夜操| 亭亭色色五月天| www.ywav| 天天综合图片| 啪啪啪综合网| 丁香五月婷婷深五月| 欧美噜一噜| 五月天激情影院| 久久月天堂| 久久婷婷五月国产色综合激情| 色五月婷婷老师| 日韩国产在线精品| 日韩成人五月天| 日本久久综合| 91操片| 色婷婷五月在线| 搡BBBB搡BBB搡18| 天天搞夜夜爽夜夜爽| 色色色网站| 9精品国产在热久久| 色五月婷婷天天干| 26uuu欧美| 婷婷四色五月| 亚洲激情av| 婷婷欧美激情| 日本色婷婷| 激情综合五月丁香六月婷婷| 国语精品探花| 婷婷成人av| 色婷婷六月综合| 国产超碰在线| 干婷婷五月天| 免费观看全黄做爰的视频| 任你草| 久久92| 激情宗合 激情宗合| 日日爱699| 激情都市另类| 天天影视色综合网| 五月天婷婷激情六月久久| 五月婷婷免费| 玖玖91| 中文字幕性爱丰满| 日韩有码一区| 天天爱天天操| 九九色之九九色88| www.超碰| 99这里只有免费的小视频在线观看| 久久丁香| 婷婷五月综合欧美在线播放| 逼特逼在线免费播放| 天天天天天操| 天天色凹凸| 色播五月丁香| 综合网啪啪| 色婷| 久久久久久xxxxx| 99热只有| 五月婷婷综合色啪首页| 97婷婷五月| 久热这里只有精品6| 色色婷婷色色| 日韩1区2区| 激情综合5月| 日日躁夜夜躁狠狠久久AV| 婷婷丁香五月,狠狠综合| 亚洲99热| 9999三级片| 另类在线| 级人人91| 超碰大香蕉网| 婷婷激情六月中文| 五月婷婷精品| WWW,五月| 亚洲九九在线| 欧美三级黄色片久久| 亚洲精品视频在线播放| 五月婷久久| 九热网站| 久久久中文| 狠狠 婷婷| 色情成人五月天| 99无码视频| 色噜噜狠狠色综合无码久久欧美| 国产99久久久国产精品免费看| 五月天色婷婷成人| 婷婷中文无码| 丁香五月婷婷社区| 思思99久久| 99热精品网| 97色五月丁香婷婷| 99精品在线观看| caopeng97日韩| 精品九九婷婷| 天天干天天干天天干| 婷婷五月天成人影片| 五月丁香综合影院| 无码AV久久久久久久久| www.日本91| 色七色九九| 精品一二三区久久AAA片| 久久美女五月天| 九九精品在线视频观看| 思思热99er| AV在线资源| 五月情综合| WWW·色色色·COM| 一级AV片| 久久综合五月| 久色视频| 五月色俺婷婷| 丁香婷婷五月激情综合| 桃色激情五月天| AA片在线观看视频在线播放| 亚洲成人AV在线观看| 综合性视频99| 九九热这里只有精品5| 婷婷94s| 99这里有精品视频| 91在线日| 操一操干一干| 婷婷激情五月天在线| 国产 亚洲 在线| 九月性爱网| 国产精品成人在线| 涩综合网| 亚洲色婷婷| 婷婷色日本| 国产99热| 五月天丁香网站| WWW.五月com| 国产毛片精品一区二区色欲黄A片| 伊人网啪啪| 常久最新免费的色吊丝| 六月婷婷色宗合| 99久久66| WWW,激情五月天,COM| 99色久| 色综合网页| 极品人妻VIDEOSSS人妻| 99无码| 99久久婷| 五月天婷婷色色网| 激情五月小说婷婷| 色色色色色网站| 96性爱视频| 亚洲小说五月婷婷| 伊人久久激情图区五月| 任你艹| 日韩日比视频| 国产精品丝| 国外亚洲成AV人片在线观看| 六月婷婷五月天| 丁香五月另类色婷婷麻豆| 色中色综合| 色色综合色| 欧洲第一久色| 激情婷婷色五月| 激情五月丁香六月婷婷| 天天做天天爱天天玩夜夜爽| 六月五月婷婷| 五月香六月婷| 丁香五月婷久久| 天天干com| 亚洲激情网站| 自拍盗摄 另类| 久久人妻伦理| 狠狠干在线| 99精品福利视频| 噜噜色婷婷| 激情五月丁香亭亭| 中文资源在线a| 欧美丁香五月97色| 九九色色| 日韩限制级大尺度黑料泄密大尺度视频一区二区在线观看 | 九九性视频| 99热99热不卡| 夜夜躁爽日日| 综合色五月| 九九性视频| 五月婷婷中文| 免费无码毛片一区二区A片| 中文字幕日产A片在线看| 久久视频在线视频| 婷婷五月天丁香综合网| 婷婷综合一二三| 丁香五月网| 玖玖综合色| 五月天丁香六月综合| 五月婷婷激情四季| 可以直接看的AV网站| 日本五月天婷婷丁香| 九九视频在线| 九九碰九九爱97超碰| 丁香五月天激情| 国产成人精品一区二区三区视频| 五月色亭丁香| 久婷| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 激情com| 丁香五月网在线观看| 综合激情站| 五月天丁香婷| 日本狠狠干| 大香蕉丁香五月| 性爱五月丁香| 激情五月婷婷色综合| www、色色色| 久久婷婷网| 91九九| 婷婷五月丁香色色| 大香蕉久艹| 激情www.98com| 思思热99热| 天天插综合网| 牛牛色av| 五月婷婷色播视频| 婷婷五月激情五月激情| 国产精品美女| 五月天婷婷久草丁香| aⅤ79成人片| 天天爽夜夜爽夜爽精品| 99视频自拍| 久久大国产香蕉| 中文字幕av久久爽一区| 综合色色婷婷| 久久538| 五月天另类小说久久小说网| 永久的网站AAAA | 97色色色色色| 中文字幕高清av| 九九视频网| 五月丁香人妻| 国产美女无遮挡裸体毛片A片| 日本理论久久| 婷婷五月天亚洲激情戏精品| 九色视频91| 182无码| 99精品国产在热久久| 日本久久爱| 欧美成人精品A片免费一区99| 激情五月综合第一页| 人妻五月天激情开心网| 99在线精品观看99| 欧美人人超级碰| 丁香五月婷婷色五月| 色婷婷丁香综合中文字幕| 五月激情综合五月| 久热久| 中文av在线观看| 五月丁香 久久久| 超碰人人干| 成人国产网站| 婷婷六月视频| 河北真实伦对白精彩脏话| 色五月激情| 丁香五月婷综合网| 97五月婷| 丁香五月aV| 婷婷五月天综合在线| 人人操人人爰人人一天天碰夜夜拍夜夜爽-中国A级毛片天天看天天谢… | 91人无码久久久久久| 成人婷婷五月天| 91操碰| 看全色黄大色大片| 婷婷操婷婷干婷婷射| 99热个人在线| 深爱激情四射| 99热| 婷婷丁香六月影视| 91九色精品熟女内射| 丁香色六月婷婷| 97色女人在线| 踪合专区啪啪| 9有码中文| 91在线看免费 九九九九| 五月婷六月婷婷| 99色在线观看视频者| 色色丁香五月婷婷| 国产无遮挡又黄又爽免费网站| 婷婷,五月天,丁香,第一| 色情五月综合婷婷| 日韩无码成人电影| 99啪啪视频| 五月丁香另类图片| 激情综合色| 色噜噜狠狠色综合无码久久欧美| 婷婷六月丁| 久久久18| 大香蕉伊人久久| 婷婷五月丁香五月丁香| 桃色五月天| 日日干综合| 国产AV一区二区三区最新精品| 五月天婷亚洲综合在线嫩草网| 婷婷视频网| 激情五月深爱五月| 8090在线影视少妇| 欧美色小说婷婷| 伊人狼人干| 五月天综合视频| 色综合偷拍| 91九色熟女| 国产成人综合网| 婷婷在线视频| 婷婷五月天日日日干干干| 激婷网| 开心激情网在线| 色婷婷色综合激情91| 99狠狠| 色婷婷五月影视| 欧美成人AAA片一区国产精品| 99热骚货| 天堂色色色| 久热久| 婷婷五日b| 五月婷婷激情在线| 中文字幕,综合,91| 男人的天堂999| 亚洲精品无人区| www五月天com| 五月丁香婷婷久久| 国产精产国品一二三在观看| 五月婷婷丁香网| 99riAv1国产在线观看| 激情99| 激情综合色五月丁香六月亚洲| 超碰99热在线观看| AA丁香综合激情| 超喷97免费在线视频| 思思热热久久| 色色色色色日韩午夜激情 | 网色99| 伊人婷婷青青cao| www.sd-xiangsu.cpm| 五月天色综合服务平台| 夜丁香综合| 欧美三日本三级少妇三99| 97综合在线| 国产激情久久| 啪啪啪丁香五月| 天堂综合久| 全亚洲最大的婷婷五月天网站COM| 丁香五月天信号| 六月天六月婷| 日本狠狠色| 亚洲黄色影视| 久久无码成人| 9九色首页| 99久久精| 激情九九这里只有精品| 蜜臀av粉嫩av懂色av| 丁香六月天| 日韩五月婷婷久久| 天堂久久精品| 九玖欧洲亚洲| 99ri精品在线| 熟妇人妻中文字幕无码老熟妇| 日本三级第一页| 2017人人操| 琪琪理论片| 91色情播放| 色啪影院| 91在线观看九区| 8区视频在线| 五月色导航| 狠狠狠色激情综合适合| 日本九九九九| 九九色天堂| 天天肏屄夜夜爽| 天天爽天天摸天天爱| 亚洲色网址| 9色天堂| 91五月天| 婷婷五月在线播放| 色九九综合| 超级97碰碰| 婷婷丁香77777| 九九热视| 99国产精品白浆在线观看免费| 色婷婷啪啪| 丁香婷婷五月天校园春色| 婷婷色五月在线视频| 色婷婷久久| 91丁香婷婷综合资源| 五月停停直播| 啪啪99| av婷婷丁香| 综合亚洲五月天| 丁香五月天激情综合| 国产日产亚系列精品版优势| 玖玖色综合网| 可似看的AV| 亚洲五月天激情| 五月婷婷深深爱| www.夜夜騎夜夜狠| 五月天大香蕉| 色九亚洲| 亚洲色A| 另类小说五月天| 9久国产| 五月开心深爱激情网| 九九亚洲视频| 久久9精品| 婷婷五月av| 国产亚洲精品AAAAAAA片| 色综合大香蕉| 天天综合在线网| 爱99干99| 怡红院99| 九九热在线视频观看| 中文字幕网站在线观看| 五月激情综合深爱| 开心五月天激情网| 成人片在线播放| 色婷婷电影网| 大香久久综合网| 99精品视频在线| 五月天婷婷综合网| 日韩啪啪视频| 97超碰在线免费观看| 热久久婷婷| 99热这里只有精品50| 久热婷婷| 欧美日韩99| 亚洲在线综合| 婷婷久久内射| 色色亚洲视频| 五月激情久久| 99re热视频这里只精品| www.第四色99| 久热中文字幕在线线观看| AV九九| 人妻久久久久久久久妻久久久久久久久| 色五月成人| 六月丁香婷婷综合影院| 婷婷五月婷| 欧美日韩色色| 热思思| 99热黄| 蜜乳中文字| 日韩一级| 色五月激情婷婷| 日本A片一区| 这里精品| 色婷婷色和| 99爱在线视频观看| 欲色人妻| 天天噜噜| 小泽玛利亚视频一区二区| 婷婷五月天综合在线| 丁香五月综合无码趴趴| 婷婷五月天网| 99久re热| 久久99精品九九久久久婷婷| 欧美久热| A久久| 免费精品66| 天天射网站| 六月婷婷国产| 九九99九九精品视频| 色婷婷www| 九月婷婷综合网| 91色色色18| 亚洲天堂热| 午夜色婷婷| 五月婷庭丁香在线| 五月天社区婷婷| 久久99性爱视频| 久婷自拍视频| 国产avapp 网| 激情五月婷婷综合| 国产精产国品一二三在观看| 婷婷基地五月色| 五月天啪啪网| 六月份天丁香婷婷| 97干欧美| 九九综合色| 一二三区视频韩国| 色在线免费观看| 亚洲精品99| 婷婷色五月丁香六月欧美啪| 激情网五月| 天天模,夜夜模夜夜爽| 亚洲精品第一国产综合亚AV | 天天操B| 色婷网| 五月婷婷激情色情网| 国产女人十八水真多1| pacopacomama 070722_670 素人奥様初撮りドキュメント 103 大久保純子 | 超碰91在线| 国产毛片欧美毛片久久久 | 免费碰碰视频久| 亚洲无码色| 亚洲成人在线播放| 成人αV视频免费观看| 99这里都是精品6| 99热这里都是精品| 午夜69成人做爰视频| 婷婷丁香五月高清| 97碰碰人人| 影音先锋男人女人| 天天天在线观看| 久99| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 无遮挡国产高潮视频免费观看| 激情五月天激情综合网| 九九热99免费视频| 国产毛片精品一区二区色欲黄A片 欧美交换配乱吟粗大25P | 婷婷丁香六月| 大香蕉综合视频在线| 五月婷婷,狠狠操| 色欲Av五月天| 超碰成人在线免费观看| 婷婷综合网| 思思久久思思| 婷婷五月丁香91| 538在线精品| 色婷婷偷拍| 美女要搞搞天天搞搞搞网站| 狠狠爱婷婷丁香| 激情五月综合| 网站免费一站二站| 久久99热免费| 亚洲天堂无码| 亚洲精品无人区| 成人精品人妻| 高清无码中文字幕aVDV| 婷婷久久丁香五月| 天天揷综合网| 五月天久久久| 六月丁香社区| 狠狠色婷婷在线| 日韩性爱无码| 久久精品99国产精品日本| 日本色五月| \\五月天婷婷激情| 日韩高清成人| 26uuu成人网| 天天操天天操天天操天天操天天操| 婷婷五月花西瓜| 色色网站免费在线视频| www五月天com| 成人 在线观看国产| 色五月婷婷av| 色婷婷小说| 色月视频| 婷婷色播婷婷| 97在线/日本| 精品久久久中文字幕大豆网推荐理由| 免费亚洲婷婷中文字幕| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 亚洲色情久久| 9l视频自拍九色9l视频在线观看| 色婷婷8| 99热官网| 五月天婷婷网站888| 5月丁香六月婷婷| 丁香五月天偷拍| 婷婷久久精品| 91人人妻人人操人人爽| 婷婷五月在线视频| 26UUU欧美激情一区二区| 亚洲夜夜操| 狠狠干在线视频| 国产精品久久久99视频| 久久精品91视频| 久久女人九九| 中文AV网站| 蜜臀AV在线观看| 成人看片网站| 色五月婷婷老师| 天天插AV丝袜中| 欧美性色五月天| 亚州激情在线视频| 99在线er热| 久99久在线| 国产成人高清| 精品导航在线x不卡| 日本WwW色偷偷丁香花久久久京东热| 五月香婷婷| 六月激情婷婷| 人人操AV| 亚洲成人AV在线播放| 亚洲丁香五月天视频| 久久人妻视步| dingxiangtingtingliuyue| 99re26视频| 午夜九九电影| 婷婷狠狠久久| 涩综合在线| 《诡秘之主》在线观看| 日本在线视频www色| 久久新| 91啪啪网| 久草五月天| 六月婷婷香蕉| 久操干| www.9797国产| 啪啪黄页网| 97碰成超视频免费视频| 婷婷五月综合色中文字幕| 激情五月天色色色| 五月婷中文娱乐综合| 1024久婷| 成人人操| 激情伊人网| 久久人人九| 亚洲另类婷婷综合| 丁香五月电影| 日日日,com| 99色色网站| 五月丁香激情婷婷综合字幕| www.91有码.com| 婷婷五月激情在线| 激情五月丁香综合网站| 五月婷亚洲精品| 日日夜夜狠狠| 久草视频一,二三四| 五月婷中文字幕| www.超碰在线| 亚洲AV成人在线| 国产精品99久久久久久久女警| 久久精品国产一区二区三区四区| 免费视频WWW在线观看网站| 国产婷婷婷| 婷婷五月综合免费在线| 东北黄色一级| 91ncm视频| 91狠狠色丁香婷婷综合久久| 亚洲第一色色色| 九九操综合网| 激情小说婷婷五月| 另类图片五月天| 五月丁香香蕉| 色婷婷五月天| 97午夜一区二区| 99热在线观看99| 91超碰在线播放| 狠狠做六月爱婷婷综合aⅴ| 日 日干 日日做| 天天五月情| 天天日天天色| 丁香五月婷婷影院| 99精品视频在线观看| 秋霞九九无码| 婷婷精品综合| sS丁香五月婷婷| 丁香色五月婷婷91桃色| 五月成人网站| 日本99久久| 亚洲亚洲人成综合网络| 久久青草国| 99噜噜| 免费色色色| 婷婷五月色網站| 久久婷婷五月天激情四射| 色婷婷综合网| 色色色com| 丁香六月婷婷综合欧美| 久鲁鲁色网 | 人妻精品在线| 九九热在线精品视频| 成人精品免费在线观看| 99热国内精品| 日日天天操| 日韩啊啊啊| 久久人人妻| 超碰2021| 91精品婷婷国产综合久久| 色婷婷丁香五月丁香| 青草青青草| 操91| 婷婷酒色网| 大香蕉av在线| 五月婷婷六月婷| 丁香九月激情| 色色999三级片| 亚洲欧美成人在线| 美国天天日天天操| 黄色五月婷婷| 激情图片亚洲| 欧美婷婷日本| 热99精品视频| 九九黄色网| 中文字幕成人版| 久久久网站| 五月激情久久综合网| www.久久| 热婷婷久| 99re久热只有精品6在线直播| 五月婷婷综合丁香视频| 超碰免费在线| 日韩精品超碰在线观看| 亚洲人妻一区二区| 亚洲成人综合在线| 99热99日天天干| 五月情丁香色| 激情综合色婷婷啪啪六月天| 国产精品涩涩涩视频网站| www.91.com黄| 丁香五月综合在线视频| 婷婷亚洲天堂| 久色激情| 婷婷精品性性性性性性性| 亚洲热综合| 99re青青草| 人人操A| 这里只有精彩视频| 都市激情亚洲| 久久这里只有精品16| 五月天播播| 9月色婷婷| 天天操天天爱天天玩| 九九综合久久| 亚洲午夜视频| 亚州色色色| 江苏少妇性BBB搡BBB爽爽爽 | 五月天丁香啪啪综合| 欧美色色色色色色| 拍色综合| 国产精品-91JQ就要激情网91JQ6.91JQ27.CASA:16888 | 激情五月婷婷色综合| 国产亚洲色婷婷久久99精品91| www.99热精品99.com| 亚洲激情视频网| 久久久噜噜噜久久人妻| 色色色婷| 夜夜操夜夜操| 伊人香大香蕉视频| 99视频久久免费视频| 啪啪啪综合网| 久99久在线观看| 久久九九色| 国产av第一专区| 最新五月天婷婷影| 亚洲九九夜夜| 狠狠色丁香五月婷巨| 婷婷伊人久久| 五月天婷婷社区久久综合| 色色综合网络| 亚洲成人av中文| 五月婷丁香亚洲| 成人免费120分钟啪啪| 丁香色六月| 亚洲第一第二网站| 五月久熟女| enecarbon-materials.comWu染请涟系Bao护@wip1688| 色九四色| 成年人99热| 91中文狠狠综合| 五月丁激情| 韩国真做片在线观看| 久久er免费视频| 激情伊人五月天| www.91色| 五月综合久久| 丁香色色色| 五月婷婷黄色| 亚洲综合视频网| 思思热在线| 精品99在线观看| 饮料下药迷倒漂亮女同事强干| 日韩婷久| 五月天婷婷爱| 亚州第一A片| 人人操五月天| 婷婷刺激综合| 五月天激情小说| 91无码高清| 99热碰碰| 久久伦乱| 亚洲成人AV在线观看| 性爱网五月天| 九九色影院| 五月综合久久| 五月亭亭开心网| 人人爽在线视频综合网| 色婷婷成人| 天天干天天日天天插| 日韩艹比| 热99只有里视频| AV在线二十六页| 久色大| 久久久www| 久久久噜噜噜久久人妻| 热的国产,热的综合,热的有码| 成人国产欧美大片一区| 婷婷激情五月综合在线视频| 久久久久9久无码视频| 亚洲热久久| 国产精品丝| 成人丁香五月| 六月婷婷深深爱| 国产XXXX搡XXXXX搡麻豆| 午夜婷婷六月天| 月色色综合婷婷网| 色一情一乱一乱一区91| 亚洲无码成人网| 婷婷成人基地| 五月天激情网开心网| 久啪欧美| 99色综合| 色在线五月天免费| 色九九九综合| 91九色视频在线观看| 大香蕉手机视频| 五月婷婷六月丁香| 亚洲色婷婷视频| 久久 无毛。| 五月丁香六月色| 2025天天爽天天摸| 色婷九九九| 久久久婷婷婷| 五月丁香六月婷婷综合网| 五月天激情日色在线| 亚洲最大在线| 色婷婷丁香五月天在线视频| 狠狠爱丁香婷| 天堂久久精品| 亚洲色情激情丁香五月| 日本玖玖在线| 91精品国产91久久久久青草| 色五月婷婷少妇人妻| 五月天婷婷无码| 五月丁香免费视频| 色婷婷视频| 五月婷婷之综合激情在线| 人妻九九九九| 色六月丁香婷婷狠狠干| 丁香婷婷婷婷十二月在线观看视频| 九九99免费理论| 狠狠999| 五月天婷综合| 五月天激情国产综合婷婷婷| 九九久热| 全亚洲最大的婷婷五月天网站COM| 91蝌蚪窝视频在线| 99婷婷国产最新视频| 色婷婷激情小说网| 亚洲黄3级片网站欧美| 婷婷五月天影院| 五月天婷婷影院影院观看| 五月丁香综合啪啪| 五月天天综合网色婷婷| 色色五月丁香| 99re这里只有精品在线观看| 久久人人九九| 久久五月天激情| 色域五月婷婷丁香| 五月婷六月丁| 婷婷天堂综合| 丁香婷婷浪潮AV久久综合| 久久伊人五月天| 五月开心深深爱激情综合| 色色99| HD久久精品视频| 99国产精品久久久久久久久久久 | 五月丁香天堂网婷婷| 色丁香五月婷婷综合久久| 激情五月九九九| 久久五月网| 成人精品人妻| 久久精品凹凸分类| 91精品婷婷国产综合久久| 五月综合激情视频| 日韩成人av在线| 91丨九色丨老熟女激情| 一本色道久久综合狠狠躁小说| 日日夜夜婷婷| 成人小说 五月天 婷婷| 啪啪 综合网| 超碰在线免费观看3 9| 99免费热视频在线| 综合网亚洲| 久久性爱网站| 婷婷偷拍网| 97久久五月丁香婷婷| 国产婷婷婷| 精品久久人妻| 97精品在线| 久久视频这里99| 九月婷婷综合八月丁香在线观看| 色婷婷免费视频| 色综合久久88色综合天天| 五月婷婷六月激情| 91综合国免费久入| 婷婷六月丁香五月| 五月天激情婷婷五月天久久| 99re这里只有精品99| 另类视屏| 五月天堂六月丁香亚州中文字幕久久| 另类视频在线| 91chinese在线| 9九色首页| 亚洲激情综合免费| www.五月婷婷久久.com| 激情五月深爱五月观看| 超碰资源在线| 91丨九色丨国产在线| 五月天婷婷激情六月久久| 久热一区|