第十五天 實(shí)戰(zhàn)練習(xí)(2)
今天計(jì)劃用Python繼續(xù)一個(gè)web開發(fā)的實(shí)戰(zhàn)項(xiàng)目練習(xí)啤誊,學(xué)習(xí)項(xiàng)目及練習(xí)源碼地址:
GitHub源碼
編寫數(shù)據(jù)庫(kù)orm和驅(qū)動(dòng)封裝
在這個(gè)Web App中酌媒,所有數(shù)據(jù),包括用戶信息耸弄、發(fā)布的日志咧虎、評(píng)論等,都存儲(chǔ)在MySQL數(shù)據(jù)庫(kù)中
Web App里面有很多地方都要訪問(wèn)數(shù)據(jù)庫(kù)计呈。訪問(wèn)數(shù)據(jù)庫(kù)需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)連接砰诵、游標(biāo)對(duì)象征唬,然后執(zhí)行SQL語(yǔ)句,最后處理異常茁彭,清理資源总寒。這些訪問(wèn)數(shù)據(jù)庫(kù)的代碼如果分散到各個(gè)函數(shù)中,勢(shì)必?zé)o法維護(hù)理肺,也不利于代碼復(fù)用摄闸。
所以,我們要首先把常用的SELECT妹萨、INSERT贪薪、UPDATE和DELETE操作用函數(shù)封裝起來(lái)。
由于Web框架使用了基于asyncio的aiohttp眠副,這是基于協(xié)程的異步模型。在協(xié)程中竣稽,不能調(diào)用普通的同步IO操作囱怕,因?yàn)樗杏脩舳际怯梢粋€(gè)線程服務(wù)的,協(xié)程的執(zhí)行速度必須非澈帘穑快娃弓,才能處理大量用戶的請(qǐng)求。而耗時(shí)的IO操作不能在協(xié)程中以同步的方式調(diào)用岛宦,否則台丛,等待一個(gè)IO操作時(shí),系統(tǒng)無(wú)法響應(yīng)任何其他用戶砾肺。
這就是異步編程的一個(gè)原則:一旦決定使用異步挽霉,則系統(tǒng)每一層都必須是異步,“開弓沒(méi)有回頭箭”变汪。
幸運(yùn)的是aiomysql為MySQL數(shù)據(jù)庫(kù)提供了異步IO的驅(qū)動(dòng)侠坎。
根據(jù)orm編寫數(shù)據(jù)庫(kù)model
編寫Web框架
aiohttp已經(jīng)是一個(gè)Web框架了,為什么我們還需要自己封裝一個(gè)裙盾?
原因是從使用者的角度來(lái)說(shuō)实胸,aiohttp相對(duì)比較底層還需要繼續(xù)封裝。