国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

這個Flask后端教程藏了3層架構(gòu),新手看完少走2年彎路

0
分享至


一個完整用戶系統(tǒng)的后端代碼,網(wǎng)上能搜到上萬份。但把「為什么這樣寫」講清楚的,十不足一。

這篇教程用Flask+MySQL搭了一套帶登錄、注冊、商品展示的全棧應(yīng)用。代碼量不大,卻塞進了三層架構(gòu)、會話管理和數(shù)據(jù)庫交互三種核心模式。對想從調(diào)包俠進階的開發(fā)者來說,這是塊不錯的墊腳石。

三層架構(gòu)不是炫技,是分工

教程把系統(tǒng)拆成表現(xiàn)層、業(yè)務(wù)邏輯層、數(shù)據(jù)訪問層。表現(xiàn)層只管渲染模板和收發(fā)表單,業(yè)務(wù)層處理驗證和流程控制,數(shù)據(jù)層只和MySQL打交道。

這種拆法讓改需求變得便宜。想換前端框架?動表現(xiàn)層就行。數(shù)據(jù)庫從MySQL遷到PostgreSQL?改數(shù)據(jù)層的連接配置。各層之間用接口約定,而不是直接掏對方的數(shù)據(jù)結(jié)構(gòu)。

Flask本身沒強制分層,所以新手常犯的錯誤是把SQL語句直接糊在路由函數(shù)里。教程里的products()路由雖然簡單,但已經(jīng)做了示范:cursor的創(chuàng)建、查詢、關(guān)閉三步走,沒讓數(shù)據(jù)庫連接泄漏到全局。

會話管理:Flask的secret_key到底防什么

代碼里有一行容易被跳過:app.secret_key = 'secret-key'。這串字符是會話簽名用的私鑰,不是加密用戶數(shù)據(jù)的。

Flask的session默認存客戶端cookie里,內(nèi)容是Base64編碼的JSON,任何人都能解碼看明文。secret_key的作用是生成HMAC簽名,讓服務(wù)端能識別cookie有沒有被篡改。攻擊者改了session里的customer_id,簽名對不上,服務(wù)端直接拒掉。

教程用的'secret-key'是占位符,生產(chǎn)環(huán)境得換成32字節(jié)以上的隨機串。2023年有團隊因為把密鑰提交到GitHub,被爬蟲批量薅走數(shù)據(jù)庫憑證,這類事故在OWASP報告里年年上榜。

登錄流程的防御細節(jié)

顧客登錄路由customer_login做了幾件事:POST請求時取表單數(shù)據(jù),SQL參數(shù)化查詢防注入,驗證通過后往session寫用戶ID和姓名,失敗則回傳錯誤信息。

參數(shù)化查詢的%s不是字符串拼接,是MySQLdb的占位符機制。即使用戶輸入' OR '1'='1,也會被當(dāng)作普通字符串處理,不會篡改查詢語義。這是2008年就成熟的防御手段,但2024年的漏洞庫里依然能搜到拼接SQL的新項目。

session里只存了customer_idcustomer_name,沒存密碼哈希。這是正確的——密碼驗證是一次性的,沒必要在內(nèi)存里留著。有些框架的示例代碼會把整個用戶對象塞進session,既浪費帶寬又增加泄露面。

注冊校驗的邊界情況

注冊路由customer_signup的校驗邏輯值得細看。先檢查四個字段是否全填,再比對密碼和確認密碼,最后查郵箱是否已存在。三步校驗的順序有講究:前端該做的格式檢查(如郵箱正則)這里沒做,因為教程聚焦后端;但后端必須防的重復(fù)注冊和空值注入,一步?jīng)]落。

密碼比對用明文,教程注釋里應(yīng)該提了生產(chǎn)環(huán)境要換bcrypt或Argon2。明文存儲是2010年前的做法,現(xiàn)在連CSDN都不再犯這個錯。如果這是教學(xué)代碼,需要加顯式警告;如果是項目代碼,屬于需要立即修復(fù)的漏洞。

查重郵箱的SQL用了SELECT id而不是SELECT *,這是個小優(yōu)化。MySQL的覆蓋索引機制下,只查主鍵可以不走回表,雖然在這個數(shù)據(jù)量下差別微乎其微,但習(xí)慣養(yǎng)成后在大表上能省出數(shù)量級的時間。

模板渲染的權(quán)限暗示

登錄和注冊路由都傳了rolerole_key給模板,說明這套系統(tǒng)可能還有管理員或其他角色。模板層根據(jù)這些變量渲染不同的文案和跳轉(zhuǎn)鏈接,但真正的權(quán)限校驗應(yīng)該在路由裝飾器或中間件里做。

教程沒展示管理員代碼,但從結(jié)構(gòu)能推測:如果/admin路由只檢查session.get('admin_id'),那偽造session就能越權(quán)。完整的方案是每次請求都查數(shù)據(jù)庫驗證角色,或者把角色信息寫進JWT并設(shè)短過期時間。Flask-Login這類擴展封裝了這些細節(jié),但理解原生實現(xiàn)有助于調(diào)bug。

MySQL連接的隱式坑

配置段把用戶名密碼寫死在代碼里,是教程的常見妥協(xié)。實際部署至少要用環(huán)境變量或密鑰管理服務(wù),Docker場景下可以掛secret文件。

更隱蔽的問題是連接池。Flask-MySQLdb每次請求新建連接,小流量沒事,并發(fā)稍高就會打爆MySQL的max_connections。生產(chǎn)環(huán)境該換SQLAlchemy配連接池,或者把Flask跑在Gunicorn多進程模式下分擔(dān)壓力。教程沒提這些,但代碼結(jié)構(gòu)預(yù)留了替換空間——數(shù)據(jù)層集中在幾個路由函數(shù)里,不像有些項目把SQL撒得滿屏都是。

數(shù)據(jù)庫名noeari看起來是隨機打的,這種命名在團隊協(xié)作時會制造困惑。測試環(huán)境用app_test、生產(chǎn)用app_prod是更清晰的約定,配合Flask的app.config.from_envvar可以按環(huán)境加載不同配置。

商品列表路由products加了is_available = 1的過濾條件,說明數(shù)據(jù)庫里可能有軟刪除或下架機制。沒展示的是這個字段誰有權(quán)修改——如果普通用戶能通過某個接口把自己買的商品標(biāo)為不可用,就屬于業(yè)務(wù)邏輯漏洞。三層架構(gòu)防不了這種錯,得靠測試用例覆蓋。

代碼里沒異常處理。MySQL連接失敗會拋OperationalError,直接暴露500頁面和堆棧信息。Flask的errorhandler裝飾器可以攔截這些異常,返回友好的錯誤頁并記日志。對新手教程來說,省略異常處理是合理的,但上線前必須補上。

session的持久化也沒提。默認cookie-based session在瀏覽器關(guān)閉后就消失,要實現(xiàn)「記住我」功能得換服務(wù)端存儲,比如Redis或數(shù)據(jù)庫表。Flask-Session擴展做了這層封裝,但理解cookie的局限性能幫你選對方案。

整個項目的代碼風(fēng)格是教學(xué)式的:變量名直白,注釋分段清晰,沒有抽象過度。比如路由函數(shù)里直接操作cursor,沒封裝成DAO類。這種寫法在真實項目里會膨脹,但作為入門材料,讓讀者一眼看清數(shù)據(jù)流向比追求架構(gòu)完美更重要。

如果你跟著敲完這套代碼,下一步該問自己:如果把MySQL換成MongoDB,哪些層要動?如果要做API版本控制,URL路由怎么設(shè)計?如果用戶量漲到十萬,session存儲怎么擴展?這些問題沒有標(biāo)準(zhǔn)答案,但三層架構(gòu)給了你做決定的坐標(biāo)系。

教程最后沒給部署指南,這是故意的——本地跑通和上線運維之間,還隔著Nginx配置、HTTPS證書、日志輪轉(zhuǎn)、監(jiān)控告警十條街。那些是另一篇文章的篇幅,也是區(qū)分「能寫代碼」和「能扛系統(tǒng)」的分水嶺。

你現(xiàn)在手邊有類似的項目嗎?是直接把SQL寫在視圖函數(shù)里,還是已經(jīng)拆出了獨立的數(shù)據(jù)層?

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
全球資產(chǎn)管理巨頭貝萊德CEO:若油價達到每桶150美元,將引發(fā)全球經(jīng)濟衰退

全球資產(chǎn)管理巨頭貝萊德CEO:若油價達到每桶150美元,將引發(fā)全球經(jīng)濟衰退

紅星新聞
2026-03-25 16:13:23
到底有多無知,才能做出這樣的判決!

到底有多無知,才能做出這樣的判決!

槽三刀
2026-03-25 22:01:04
悲催!怎么會這么巧?張雪峰和曝光眼鏡暴利的記者,都是心臟驟停

悲催!怎么會這么巧?張雪峰和曝光眼鏡暴利的記者,都是心臟驟停

火山詩話
2026-03-24 18:23:32
重磅實錘!瓜帥即將告別曼城,下一站徹底跳出英超

重磅實錘!瓜帥即將告別曼城,下一站徹底跳出英超

瀾歸序
2026-03-26 06:02:38
ESPN:薩拉赫是英超歷史最佳,甚至可以沒有之一

ESPN:薩拉赫是英超歷史最佳,甚至可以沒有之一

懂球帝
2026-03-25 23:20:06
患者的住院檢查報告竟是偽造的,中山五院致歉,珠海市衛(wèi)健局:全面排查醫(yī)療機構(gòu)外送檢查報告

患者的住院檢查報告竟是偽造的,中山五院致歉,珠海市衛(wèi)健局:全面排查醫(yī)療機構(gòu)外送檢查報告

極目新聞
2026-03-25 17:53:18
在岸人民幣兌美元(CNY)北京時間03:00收報6.8986元,較周二夜盤收盤跌70點

在岸人民幣兌美元(CNY)北京時間03:00收報6.8986元,較周二夜盤收盤跌70點

每日經(jīng)濟新聞
2026-03-26 05:37:03
所有退休人員注意:社區(qū)這張表再不填,這些福利和錢統(tǒng)統(tǒng)跟你無關(guān)

所有退休人員注意:社區(qū)這張表再不填,這些福利和錢統(tǒng)統(tǒng)跟你無關(guān)

娛樂的硬糖吖
2026-03-26 05:20:34
西甲積分榜:巴薩73分領(lǐng)跑!皇馬69分第2!奧維耶多21分墊底!

西甲積分榜:巴薩73分領(lǐng)跑!皇馬69分第2!奧維耶多21分墊底!

林子說事
2026-03-26 01:59:35
大學(xué)教授、博導(dǎo)巴曙松被辦案機關(guān)帶走,疑涉非法集資案

大學(xué)教授、博導(dǎo)巴曙松被辦案機關(guān)帶走,疑涉非法集資案

TOP大學(xué)來了
2026-03-26 00:06:19
國際油價暴漲,國內(nèi)油價卻“壓著不漲”!國家出手了:每噸少漲1000多塊

國際油價暴漲,國內(nèi)油價卻“壓著不漲”!國家出手了:每噸少漲1000多塊

思如哲思
2026-03-26 06:36:02
霸權(quán)還沒崩,青樓先崩了:拉千萬歐美女孩下海的大佬暴斃

霸權(quán)還沒崩,青樓先崩了:拉千萬歐美女孩下海的大佬暴斃

美第奇效應(yīng)
2026-03-24 16:51:33
基辛格坦言:如果爆發(fā)核戰(zhàn)爭,中國可能只有5個地方可以躲避危險

基辛格坦言:如果爆發(fā)核戰(zhàn)爭,中國可能只有5個地方可以躲避危險

鶴羽說個事
2026-03-25 22:21:29
鬧大了!美軍東太平洋再開火!打爆44艘運輸船,150人被打死!

鬧大了!美軍東太平洋再開火!打爆44艘運輸船,150人被打死!

愛吃醋的貓咪
2026-03-25 20:19:15
頂著濃妝、騎著假馬,卻演古裝大將軍,到底誰的審美出了問題?

頂著濃妝、騎著假馬,卻演古裝大將軍,到底誰的審美出了問題?

娛樂圈筆娛君
2026-03-25 16:14:36
宅基地確權(quán)最后沖刺:今年不把名字改成兒子的,以后可能就改不了

宅基地確權(quán)最后沖刺:今年不把名字改成兒子的,以后可能就改不了

混沌錄
2026-03-19 21:59:03
華爾街大鱷稱:黃金正重演2008年劇本!金價將漲到11400美元?

華爾街大鱷稱:黃金正重演2008年劇本!金價將漲到11400美元?

王爺說圖表
2026-03-25 22:43:39
女大學(xué)生住院做檢查,報告竟是假的!珠海中山五院等多方回應(yīng)

女大學(xué)生住院做檢查,報告竟是假的!珠海中山五院等多方回應(yīng)

南方都市報
2026-03-24 12:42:25
杭州球場突發(fā),40歲男子心臟驟停倒地!緊急提醒:有這些信號,千萬別硬扛!

杭州球場突發(fā),40歲男子心臟驟停倒地!緊急提醒:有這些信號,千萬別硬扛!

環(huán)球網(wǎng)資訊
2026-03-25 17:34:17
親戚借車從不加油,這次他故意空著油箱給她,她老公卻急了:我上次不是剛加了600塊的油嗎!

親戚借車從不加油,這次他故意空著油箱給她,她老公卻急了:我上次不是剛加了600塊的油嗎!

品讀時刻
2026-03-25 09:04:33
2026-03-26 09:24:49
野生運營
野生運營
懂點產(chǎn)品,懂點AI,正在努力給平淡日子搞點新花樣。
45文章數(shù) 0關(guān)注度
往期回顧 全部

科技要聞

硅谷因AI大裁員?一線工程師戳破真相

頭條要聞

"10元手沖咖啡"阿姨曾1天賣1000杯 如今只賣兩三杯

頭條要聞

"10元手沖咖啡"阿姨曾1天賣1000杯 如今只賣兩三杯

體育要聞

35歲替補門將,憑什么入選英格蘭隊?

娛樂要聞

張雪峰遺產(chǎn)分割復(fù)雜!是否立遺囑成關(guān)鍵

財經(jīng)要聞

黃仁勛:芯片公司的時代已經(jīng)結(jié)束了

汽車要聞

智己LS8放大招 30萬內(nèi)8系旗艦+全線控底盤秀實力

態(tài)度原創(chuàng)

本地
時尚
藝術(shù)
手機
軍事航空

本地新聞

來永泰同安 赴一場春天的約會

《非窮盡列舉》,好看又絕望

藝術(shù)要聞

王洪文的狂草背后隱藏的秘密,趙孟頫書法的真實價值揭秘!

手機要聞

蘋果正式回應(yīng)iPhone半夜偷打電話bug:iOS 26.3已修復(fù)

軍事要聞

伊朗重申非交戰(zhàn)國家船只可安全通過霍爾木茲海峽

無障礙瀏覽 進入關(guān)懷版