Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
、 模板引擎的介紹
在一個(gè)web應(yīng)用程序中,如果只是使用服務(wù)器端代碼來(lái)編寫(xiě)客戶(hù)端html代碼,前后端不分離,那么會(huì)造成很大的工作量,而且寫(xiě)出來(lái)的代碼會(huì)比較難以閱讀和維護(hù)。如果只是使用客戶(hù)端的靜態(tài)的HTML文件,那么后端的邏輯也會(huì)比較難以融入到客戶(hù)端的HTML代碼中。
為了便于維護(hù),且使后端邏輯能夠比較好的融入前端的HTML代碼中,同時(shí)便于維護(hù),很多第三方開(kāi)發(fā)者就開(kāi)發(fā)出了各種Nodejs模板引擎,其中比較常用的就是Jade模板引擎和Ejs 模板引擎。
二、 Jade模板引擎的使用方法
首先,需要使用包管理工具npm下載,下載的方式非常的簡(jiǎn)單,如下:
npm install jade
下載完成之后,因?yàn)槲覀兊哪0逦募旁谀夸泇iews里面,可以通過(guò)view engine內(nèi)部變量值設(shè)定為”jade ”的方式,來(lái)使用jade模板引擎,設(shè)置代碼如下:
app.set(‘view engine’, ‘jade’ );
默認(rèn)情況下,express引用程序中的所有視圖文件都是在項(xiàng)目根目錄的views文件夾里面的,可以通過(guò)設(shè)置views內(nèi)部變量的值的方法顯示指定視圖文件的存放路徑,方法如下:
app.set(‘views’, ——dirname+’/views’)
那么,在express框架中,響應(yīng)服務(wù)器的請(qǐng)求的時(shí)候,可以使用響應(yīng)對(duì)象的方法render來(lái)渲染視圖,返回給客戶(hù)端,代碼如下:
res.render(view, [locals], [callback])
方法里面有三個(gè)參數(shù),view參數(shù)就是模板視圖的文件的名字,是一個(gè)字符串,指定需要返回給客戶(hù)端的模板視圖,locals參數(shù)值為一個(gè)對(duì)象,用于指定視圖所用的數(shù)據(jù)的變量的值或者名字,callback為回調(diào)函數(shù),其中l(wèi)ocal和callback兩個(gè)參數(shù)是可選參數(shù)。例如
res.render(‘index’,{data:‘這里是數(shù)據(jù)對(duì)象的值’})
三、Ejs模板引擎的使用方法
接下來(lái)我們介紹一下ejs模板引擎的使用方法,首先,同樣的需要使用npm包管理工具安裝esj模板引擎,代碼如下
npm install ejs
下載了EJS模板引擎之后,可以在整個(gè)項(xiàng)目的根目錄下的views文件 中,創(chuàng)建擴(kuò)展名字為ejs的模板文件,模板文件的寫(xiě)法和HTML的寫(xiě)法大致相同,沒(méi)有太大的區(qū)別,輸出表達(dá)式寫(xiě)成
<%s=輸出表達(dá)式%>
可以像在php文件或者asp.net文件中一樣,混寫(xiě)服務(wù)器端nodejs腳本,攪拌寫(xiě)在<%腳本語(yǔ)言%>中
同樣的,在服務(wù)器端接收到客戶(hù)端的請(qǐng)求后,在express框架的web應(yīng)用程序中,可以通過(guò)render方法返回給html,示例代碼如下:
res.render(‘index’, {data : ‘這里是數(shù)據(jù)的值得’})
第一個(gè)參數(shù)為模板,可以加后綴如:index.ejs,或者省略,第二個(gè)參數(shù)為數(shù)據(jù)對(duì)象,那么我們用數(shù)據(jù)對(duì)象的名字變量 ,去寫(xiě)模板視圖,那么響應(yīng)給客戶(hù)端的就是一個(gè)完整的html。
四、 總結(jié)
除了以上兩個(gè)模板引擎以外,nodejs還有很多的模板引擎可以使用,例如Haml模板引擎、CoffeeKup模板引擎以及jQuery模板引擎等等,只是我們介紹的這兩種是現(xiàn)在比較主流的,使用的比較多的,其他的用法差異并不是非常的大,要學(xué)會(huì)舉一反三,當(dāng)然,我們只是初略的介紹了jade模板引擎和ejs模板引擎的用法,想要熟練的掌握,還得需要自行寫(xiě)代碼聯(lián)系驗(yàn)證,畢竟,實(shí)踐出真知。
感謝源碼時(shí)代H5學(xué)科講師提供此文章!
本文為原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處(http://www.itsource.cn)!
近有不少小伙伴私信小編要Smarty的學(xué)習(xí)資料,今天技術(shù)學(xué)派就把Smarty相關(guān)的課堂講義整理給小伙伴們,希望對(duì)小伙伴們?cè)趯W(xué)習(xí)上有所幫助。
在實(shí)際的開(kāi)發(fā)中,公司都是分工明確的,PHP程序員主要負(fù)責(zé)PHP代碼也就是業(yè)務(wù)邏輯相關(guān)的部分,Web前端程序員主要負(fù)責(zé)的是HTML、CSS、JavaScript也就是讓頁(yè)面更加美觀用戶(hù)體驗(yàn)更好的部分,模板引擎就起到了模板(界面)與業(yè)務(wù)邏輯代碼相分離的一種解決方案。
模板引擎原理示意圖:
Html頁(yè)面先使用占位符代替,然后模板引擎再?gòu)腜HP文件讀取真實(shí)數(shù)據(jù),并最終生成一個(gè)編譯文件,使用真實(shí)數(shù)據(jù)替換占位符
目前模板引擎技術(shù)有很多,Laravel框架(blade模板引擎)、ThinkPHP框架(自己的模板引擎技術(shù)),這里說(shuō)一下Smarty,Smarty的簡(jiǎn)單介紹
過(guò)程化開(kāi)發(fā)因?yàn)槭撬械拇aHTML和PHP混排,功能升級(jí)會(huì)導(dǎo)致代碼越來(lái)越臃腫很不方便,而且開(kāi)發(fā)速度慢,但是,因?yàn)椴恍枰窨蚣荛_(kāi)發(fā)那樣加載大批量的拓展類(lèi)庫(kù),所以運(yùn)行速度相對(duì)較快。
框架開(kāi)發(fā)因?yàn)槭遣捎锰厥饩幊棠J剿宰屛覀兏菀坠芾鞵HP代碼和HTML代碼。并且,各司其職,后臺(tái)人員寫(xiě)后臺(tái)功能;前端人員寫(xiě)前端效果,最后項(xiàng)目合并即可,所以開(kāi)發(fā)速度很快。但是,因?yàn)樾枰虞d第三方類(lèi)庫(kù)以及各種配置信息,所以運(yùn)行效率會(huì)有所下降。
因?yàn)樵趯W(xué)習(xí)Smarty的時(shí)候,會(huì)使用到一些概念性的新內(nèi)容,因此我們需要補(bǔ)充一些知識(shí)點(diǎn)。
1. 類(lèi)型約束
主要針對(duì)于函數(shù)和類(lèi)當(dāng)中的成員方法,沒(méi)有被約束的類(lèi)時(shí)可以傳遞任何類(lèi)型的信息到函數(shù)及方法中的
版本可約束類(lèi)型5.6及以下字符串、浮點(diǎn)型、數(shù)組型、對(duì)象型7.0及以上字符串、整型、浮點(diǎn)型、布爾型、數(shù)組型、對(duì)象型
2. 對(duì)象遍歷
foreach除了可以遍歷數(shù)組,也可以實(shí)現(xiàn)對(duì)象的遍歷,它可以對(duì)對(duì)象中的公有成員屬性進(jìn)行遍歷。
//定義一個(gè)類(lèi)
class Meinv
{
public $name = '女神';
public $sex = '女';
public $age = '18';
}
?
//實(shí)例化對(duì)象
$gao = new Meinv();
?
//遍歷該對(duì)象
foreach($gao as $k=>$v){
echo $k.'=>'.$v.'<br/>';
}
?
//輸出結(jié)果
name=>女神
sex=>女
age=>18
3. 常用函數(shù)
在后續(xù)的文章中一些會(huì)用到的函數(shù),我們提前整理成一個(gè)表供大家參考。
4. 魔術(shù)常量
PHP的自定義異常處理會(huì)應(yīng)用到如下的幾個(gè)魔術(shù)常量
5. 異常處理
PHP已經(jīng)為我們準(zhǔn)備了兩個(gè)可以用于代碼遇到異常時(shí)終止程序并提示錯(cuò)誤信息的方法,它們分別為die和exit,但是這兩種方法提示的異常信息過(guò)于簡(jiǎn)陋,而且無(wú)法實(shí)現(xiàn)一場(chǎng)信息的存儲(chǔ),因此PHP為我們準(zhǔn)備了自定義異常處理類(lèi)!Exception!
//語(yǔ)法格式
try{
//這里要嘗試做一件事兒
if(...){
//若要拋出異常,可以使用如下語(yǔ)句
throw new Exception('錯(cuò)誤信息','錯(cuò)誤編號(hào)');
}
}catch(catch $e){ //這里做的錯(cuò)誤信息的捕獲
$e->getMessage(); //獲取異常錯(cuò)誤信息
$e->getCode(); //獲取異常編號(hào)信息
$e->getFile(); //獲取異常文件路徑
$e->getLine(); //獲取異常代碼行號(hào)
}
之前我們學(xué)習(xí)過(guò)MySQL數(shù)據(jù)庫(kù)操作,使用了mysqli這一套數(shù)據(jù)庫(kù)處理函數(shù),雖然可以完成基本使用,但卻有美中不足。PDO的出現(xiàn)可以幫我們完成跨數(shù)據(jù)庫(kù)、支持SQL語(yǔ)句預(yù)處理及事務(wù)處理等功能。
PDO全稱(chēng):php data object (php的數(shù)據(jù)庫(kù)抽象層)
1. PDO的特點(diǎn)
2. PDO的配置方式
3. PDO的三種使用方式
3.1 基本使用
3.2 預(yù)處理使用
3.3 事務(wù)處理使用
在學(xué)習(xí)Smarty之前,還有最后的一部分內(nèi)容需要我們準(zhǔn)備一下,那就是模板引擎概念的剖析,下面的案例,我們將會(huì)把模板引擎的原理拆開(kāi)揉碎講解給大家,只有掌握模板引擎原理,才能在后續(xù)的Smarty、ThinkPHP及Laravel的使用中顯得更加得心應(yīng)手。
1. HTML&PHP 原生寫(xiě)法
就是將HTML和PHP寫(xiě)在一塊的方法,這種寫(xiě)法解析速度快,卻不易升級(jí),因此現(xiàn)在很少會(huì)有公司使用原生寫(xiě)法搭建項(xiàng)目
2. 模板引擎寫(xiě)法
有了模板引擎之后,我們就可以讓HTML和PHP各司其職了!HTML只負(fù)責(zé)顯示內(nèi)容,PHP只負(fù)責(zé)業(yè)務(wù)邏輯
通過(guò)上面的學(xué)習(xí),大家已經(jīng)掌握了模板引擎的使用原理,下面,我們就可以輕松的來(lái)使用Smarty模板引擎來(lái)實(shí)現(xiàn)一些基本使用了
1. 定義
Smarty
Python的便利性和多功能性意味著它幾乎被用于構(gòu)建各行各業(yè)的軟件。一個(gè)主要的利基是web服務(wù),Python的開(kāi)發(fā)速度和靈活性使其可以很容易地快速建立和運(yùn)行網(wǎng)站。正如您可能猜到的那樣,Python在web框架中為您提供了大量的選擇和自由度,無(wú)論大小。畢竟,不是每個(gè)web項(xiàng)目都需要是企業(yè)級(jí)的。大多數(shù)應(yīng)該能足夠完成工作就可以了,而不是追逐更大。本文將8個(gè)最知名的Python框架,它們強(qiáng)調(diào)簡(jiǎn)單性、輕量級(jí)交付,接下來(lái)就具體點(diǎn)地了解下這些框架。
Bottle(http://bottlepy.org/)可以被認(rèn)為是一種迷型Flask,因?yàn)樗踔帘绕渌摹拔⒖蚣堋备o湊和簡(jiǎn)潔。由于Bottle占用的空間很小(最小化封裝),所以它非常適合包含在其他項(xiàng)目中,或者用于快速交付像REST APIs這樣的小項(xiàng)目。(后面會(huì)討論Flask。)
Bottle的整個(gè)代碼庫(kù)都可以放在一個(gè)文件中,并且完全沒(méi)有外部依賴(lài)關(guān)系。即便如此,Bottle還是配備了足夠的功能來(lái)構(gòu)建常見(jiàn)的web應(yīng)用程序,而不需要依賴(lài)外界的幫助。
Bottle中的路由系統(tǒng)將url映射到函數(shù),其語(yǔ)法與Flask幾乎完全相同。應(yīng)用中你也不會(huì)被局限于一組硬連接的路徑,而是可以動(dòng)態(tài)地創(chuàng)建它們。請(qǐng)求和響應(yīng)數(shù)據(jù)、cookie、查詢(xún)變量、POST操作的表單數(shù)據(jù)、HTTP報(bào)頭和文件上傳都可以通過(guò)Bottle的對(duì)象訪問(wèn)和操作。
每一項(xiàng)能力的實(shí)現(xiàn)都很注意細(xì)節(jié)。例如,對(duì)于文件上傳,如果文件的命名約定與目標(biāo)文件系統(tǒng)沖突(例如在Windows中文件名中的斜杠),則不必重命名文件。Bottle可以幫你做到這一點(diǎn)。
Bottle包含有它自己的簡(jiǎn)單HTML模板引擎。同樣,盡管模板引擎很小,但它具有所有的基本功能。模板中包含的變量默認(rèn)使用安全HTML渲染;同時(shí)你必須指出,哪些變量是安全的,以便按照字面意思重新生成。如果您愿將Bottle的模板引擎換為另一個(gè)模板引擎,比如Jinja2,那么Bottle可以讓您輕松地這樣做。我更喜歡與Bottle捆綁的簡(jiǎn)單模板系統(tǒng);它速度快,語(yǔ)法樸實(shí)無(wú)華,并且允許您在不太困難的情況下混合代碼和模板文本。
Bottle甚至支持多個(gè)服務(wù)器后端。它自帶了用于快速測(cè)試的內(nèi)置迷你服務(wù)器(內(nèi)置了開(kāi)發(fā)服務(wù)器),而且還支持通用的WSGI、各種與WSGI兼容的HTTP服務(wù)器,如果需要,也可支持普通的舊式CGI。比如,在Bottle中的“Hello World”程序:
from bottle import route, run, template
@route('/hello/<name>')
def index(name):
return template('<b>Hello {{name}}</b>!', name=name)
run(host='localhost', port=8080)
運(yùn)行此腳本或?qū)⑵湔迟N到Python控制臺(tái),然后將瀏覽器指向
http://localhost:8080/hello/world。就這樣實(shí)現(xiàn)了編程中“經(jīng)典”。
與其他框架相比,Bottle不需要那么多的文檔,但是它的文檔也絕不少。所有的關(guān)鍵內(nèi)容都適用于單頁(yè)面(雖然很長(zhǎng)的)。除此之外,您還可以找到每個(gè)API的完整文檔、在各種基礎(chǔ)設(shè)施上部署的示例、對(duì)內(nèi)置模板語(yǔ)言的解釋和大量常用方法。
與Flask一樣,您可以手動(dòng)或通過(guò)插件擴(kuò)展Bottle的功能。Bottle插件遠(yuǎn)沒(méi)有Flask插件那么多,但是擁有著一些有用的部分,如與各種數(shù)據(jù)庫(kù)層的集成和基本的用戶(hù)身份驗(yàn)證。對(duì)于異步支持,Bottle可用現(xiàn)有的異步運(yùn)行的服務(wù)器適配器,比如aiohttp/uvloop,但是sync/await不是原生支持。
Bottle的極簡(jiǎn)設(shè)計(jì)的一個(gè)后果就是有些東西根本就不存在。表單驗(yàn)證,包括CSRF(cross-site request forgery,跨站點(diǎn)請(qǐng)求偽造)保護(hù)特性沒(méi)有包括在內(nèi)。如果您想構(gòu)建一個(gè)支持高度用戶(hù)交互的web應(yīng)用程序,您需要自己添加這種支持。
Bottle的另一個(gè)問(wèn)題是發(fā)展已經(jīng)遲滯很久了,最新版本是0.12,最開(kāi)始是在2013年發(fā)布的,后又小版本更新(最新穩(wěn)定版是2019年12月發(fā)布的0.12.18,開(kāi)發(fā)中的0.13版還沒(méi)正式發(fā)布)。也就是說(shuō),Bottle將繼續(xù)被維護(hù),并且它的開(kāi)發(fā)版本仍然可以用于生產(chǎn)。開(kāi)發(fā)人員打算交付新的版本,以擺脫對(duì)Python的遺留版本的支持。
關(guān)于Bottle下載與安裝
使用pip install bottle安裝最新的穩(wěn)定版本,或者將bottle.py(不穩(wěn)定)下載到您的項(xiàng)目目錄中。除了Python標(biāo)準(zhǔn)庫(kù)之外,Bottle沒(méi)有硬依賴(lài)項(xiàng)。Bottle支持Python 2.7和Python 3。
注意,自0.13版本開(kāi)始不推薦在Python 2.5和2.6下使用Bottle,此版本去掉了對(duì)它們的支持。
概要總結(jié)一下:Bottle是一個(gè)快速和簡(jiǎn)單的微型框架,用于小型web應(yīng)用程序。它提供了url參數(shù)支持、模板、內(nèi)置HTTP服務(wù)器和許多用于第三方WSGI/HTTP- Server和模板引擎的適配器服務(wù)于請(qǐng)求分派(路由)——所有這些都在一個(gè)文件中,除了Python標(biāo)準(zhǔn)庫(kù)之外沒(méi)有其他依賴(lài)關(guān)系。
CherryPy(http://www.cherrypy.org/)已經(jīng)以這樣或那樣的形式存在了將近20年,但并沒(méi)有失去它從一開(kāi)始就與眾不同的極簡(jiǎn)主義和優(yōu)雅。
CherryPy背后的目標(biāo),除了只包含服務(wù)web頁(yè)面所需要的少量?jī)?nèi)容之外,是盡可能讓人感覺(jué)不像“web框架”,而是像任何其他類(lèi)型的Python應(yīng)用程序。像Hulu和Netflix這樣的網(wǎng)站已經(jīng)在生產(chǎn)中使用了CherryPy,因?yàn)檫@個(gè)框架提供了一個(gè)非常包容的構(gòu)建基礎(chǔ)。CherryPy在底層使用線程池,更好地支持多線程服務(wù)器適配器。
CherryPy可以讓您的web應(yīng)用程序遠(yuǎn)離核心邏輯。要將應(yīng)用程序的函數(shù)映射到CherryPy提供的url或路由,需要?jiǎng)?chuàng)建一個(gè)類(lèi),其中對(duì)象的名稱(chēng)空間直接映射到需要提供服務(wù)的url。例如,網(wǎng)站的根目錄由一個(gè)名為“index”的函數(shù)提供。傳遞給這些函數(shù)的參數(shù)用于相應(yīng)的處理GET或POST方法提供的變量。
CherryPy包含的比特意味著作為低級(jí)構(gòu)建塊工作。包含了Session標(biāo)識(shí)符和cookie處理,但沒(méi)有包含HTML模板。與Bottle一樣,CherryPy提供了一種將路由映射到磁盤(pán)目錄的方法,用于靜態(tài)文件服務(wù)。
CherryPy通常會(huì)遵從現(xiàn)有的第三方庫(kù)來(lái)支持某個(gè)特性,而不是本地化(原生)提供它。例如,WebSocket應(yīng)用程序不是由CherryPy直接支持的,而是通過(guò)ws4py庫(kù)支持的。
CherryPy的文檔包含一個(gè)方便的教程,介紹了該程序的各個(gè)方面。與其他一些框架教程不同,它不會(huì)帶您了解完整的端到端應(yīng)用程序,但仍然很有用。文檔中有關(guān)于虛擬主機(jī)部署、通過(guò)Apache和Nginx進(jìn)行反向代理以及許多其他場(chǎng)景的便簽筆記式說(shuō)明。
應(yīng)用示例代碼如下:
import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
cherrypy.quickstart(HelloWorld())
如果您正在構(gòu)建基于REST的APIs,那么Falcon(
http://falconframework.org/)就是專(zhuān)門(mén)為您設(shè)計(jì)的。精悍、快速,除了標(biāo)準(zhǔn)庫(kù)之外幾乎沒(méi)有依賴(lài),F(xiàn)alcon提供了REST api所需的一切,僅此而已。2019年發(fā)布的Falcon2.0廢除了對(duì)Python 2.x支持,并且至少需要Python 3.5。
Falcon獲得“輕薄”(light & slender)標(biāo)簽的很大一部分原因與框架中的代碼行數(shù)無(wú)關(guān)。這是因?yàn)镕alcon幾乎沒(méi)有將自己的結(jié)構(gòu)強(qiáng)加給應(yīng)用程序。Falcon應(yīng)用程序所要做的就是指出哪些函數(shù)映射到哪些API端點(diǎn)。從端點(diǎn)返回的JSON只涉及設(shè)置路由以及經(jīng)由Python標(biāo)準(zhǔn)庫(kù)json.dumps函數(shù)返回的數(shù)據(jù)。對(duì)異步的支持還沒(méi)有在Falcon中實(shí)現(xiàn),但是正在努力在Falcon 3.0中實(shí)現(xiàn)。
Falcon還采用了健全的開(kāi)箱即用的默認(rèn)設(shè)置,所以安裝時(shí)不需要什么修改。例如,對(duì)于沒(méi)有顯式聲明的任何路由,默認(rèn)情況下都會(huì)引發(fā)404s。如果希望向客戶(hù)機(jī)返回錯(cuò)誤,可以?huà)伋雠c框架捆綁在一起的大量常規(guī)異常(如HTTPBadRequest)中的一個(gè),或者使用通用的falcon.HTTPError異常。如果需要對(duì)路由進(jìn)行預(yù)處理或后處理,F(xiàn)alcon也為它們提供了鉤子。
Falcon對(duì)APIs的關(guān)注意味著這里很少有使用傳統(tǒng)HTML用戶(hù)界面構(gòu)建web應(yīng)用程序的內(nèi)容。例如,不要對(duì)表單處理函數(shù)和CSRF保護(hù)工具抱有太多期望。但是,F(xiàn)alcon提供了優(yōu)雅的選項(xiàng)來(lái)擴(kuò)展其功能,因此可以構(gòu)建更復(fù)雜的項(xiàng)目。除了上述鉤子機(jī)制之外,您還可以找到一個(gè)用于創(chuàng)建中間件的接口,該接口可用于包裝所有Falcon的APIs。
與其他框架相比,F(xiàn)alcon的文檔比較少,但這只是因?yàn)楦采w的內(nèi)容比較少。用戶(hù)指南包括對(duì)所有主要特性的正式的逐步演示,以及快速啟動(dòng)部分,允許您查看有或沒(méi)有注釋的樣例代碼。
示例代碼如下:
class QuoteResource:
def on_get(self, req, resp):
"""Handles GET requests"""
quote = {
'quote': (
"I've always been more interested in "
"the future than in the past."
),
'author': 'Grace Hopper'
}
resp.media = quote
api = falcon.API()
api.add_route('/quote', QuoteResource())
FastAPI(
https://fastapi.tiangolo.com/)的名稱(chēng)很好地總結(jié)了它所做的事情。它被構(gòu)建為快速創(chuàng)建API端點(diǎn)而服務(wù),且運(yùn)行速度也很快。
FastAPI利用Starlette項(xiàng)目作為其高速網(wǎng)絡(luò)核心,但是要使用FastAPI,您不需要了解Starlette的內(nèi)部原理。定義端點(diǎn)的方式與Flask或Bottle應(yīng)用程序非常相似——使用裝飾器(decorator)來(lái)指明哪個(gè)函數(shù)處理哪個(gè)路由——然后返回自動(dòng)轉(zhuǎn)換成JSON的字典。
您可以很容易地重寫(xiě)返回內(nèi)容的方式。例如,如果希望從某些端點(diǎn)返回HTML/XML,只需返回一個(gè)自定義響應(yīng)對(duì)象即可。如果您想要添加自定義中間件,您可以彈出任何遵循ASGI標(biāo)準(zhǔn)的內(nèi)容。
FastAPI使用Python的類(lèi)型提示來(lái)提供路由所接受的數(shù)據(jù)類(lèi)型的約束。例如,如果您有一個(gè)類(lèi)型為Optional[int]的路由,F(xiàn)astAPI將拒絕除整數(shù)以外的所有提交。你不需要添加數(shù)據(jù)校驗(yàn)代碼到你的端點(diǎn),可以只使用類(lèi)型提示,然后讓FastAPI來(lái)完成這項(xiàng)工作。
當(dāng)然,有些東西被省略了。例如,沒(méi)有原生HTML模板引擎,但并不缺少填補(bǔ)這一空白的第三方解決方案。數(shù)據(jù)庫(kù)連接也是如此,但是文檔中包含了關(guān)于如何協(xié)同某些ORMs(例如Peewee)使用FastAPI的異步行為而工作的細(xì)節(jié)。
示例代碼如下:
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
許多關(guān)于Python web框架的討論都從Flask(http://flask.pocoo.org/)開(kāi)始,這是有原因的。Flask構(gòu)建良好,易于理解的框架,很容易使用并且很穩(wěn)定。在輕量級(jí)web項(xiàng)目或基本REST API中使用Flask幾乎是不可能出錯(cuò)的,但是如果您試圖構(gòu)建任何更大的東西,你將會(huì)面臨很大的負(fù)擔(dān)。
Flask的主要吸引力在于它的低門(mén)檻。一個(gè)基本的“hello world”應(yīng)用程序可以用不到10行Python代碼完成。Flask包含了一個(gè)廣泛使用的HTML模板系統(tǒng)Jinja2,它可以使文本的渲染更加容易,但是Jinja2可以被替換為任意數(shù)量的其他模板引擎(比如Mustache:
https://github.com/defunkt/pystache),或者您也可以使用自己的模板引擎。
Flask版Hello World 應(yīng)用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
把這個(gè)保存為hello.py或其它不是flask.py的文件,然后就可以按照一定的模式來(lái)運(yùn)行程序了:
$ export FLASK_APP=hello.py
$ flask run
* Running on http://127.0.0.1:5000/
或者在windows下
命令行窗口:C:\path\to\app>set FLASK_APP=hello.py
Powershell:PS C:\path\to\app> $env:FLASK_APP = "hello.py"
或者可以使用 python -m flask:
$ export FLASK_APP=hello.py
$ python -m flask run
* Running on http://127.0.0.1:5000/
(詳情可以參考官網(wǎng)進(jìn)一步了解)
出于簡(jiǎn)單性的考慮,F(xiàn)lask省略了一些細(xì)節(jié),比如數(shù)據(jù)層或者ORM,并且沒(méi)有提供類(lèi)似表單驗(yàn)證的功能。然而,F(xiàn)lask可通過(guò)擴(kuò)展支持機(jī)制進(jìn)行擴(kuò)展,已有的擴(kuò)展有幾十個(gè),覆蓋了許多常見(jiàn)的用例場(chǎng)景,比如緩存,表單處理和驗(yàn)證,以及數(shù)據(jù)庫(kù)連接。這種缺省設(shè)計(jì)允許你以絕對(duì)最小的功能開(kāi)始設(shè)計(jì)一個(gè)Flask應(yīng)用程序,然后在你需要的時(shí)候?qū)⑺鼈兎謱印?/p>
Flask的文件是親切和容易閱讀。快速開(kāi)始文檔很好地幫助您入門(mén),同時(shí)還解釋了簡(jiǎn)單的Flask應(yīng)用程序的默認(rèn)選擇的重要性,并且API文檔中有很多很好的例子。同樣優(yōu)秀的還有Flash示例片段的集合,是一些如何完成特定任務(wù)的快速而粗糙的示例,例如,如果對(duì)象存在如何返回,或者如果對(duì)象不存在,如何返回404錯(cuò)誤。
在2018年,F(xiàn)lask發(fā)布了具有里程碑意義的1.0版本,其中Python 2.6和Python 3.3是最小的支持版本,并且它的許多行為最終都是固定不變的。Flask不顯式地支持Python的異步語(yǔ)法,但是一個(gè)API兼容的Flask變體Quart已經(jīng)被分離出來(lái)以滿(mǎn)足這個(gè)需求。
小巧輕便的Pyramid(https://trypyramid.com/)非常適合于一些這樣的任務(wù),比如將現(xiàn)有的Python代碼作為REST API公開(kāi),或者為開(kāi)發(fā)人員承擔(dān)大部分繁重工作的web項(xiàng)目提供核心支持。
“Pyramid會(huì)讓你迅速變得富有成效,并與你一起成長(zhǎng),”文檔簡(jiǎn)述中說(shuō)。“當(dāng)你的應(yīng)用程序很小的時(shí)候,它不會(huì)阻礙你;當(dāng)你的應(yīng)用程序變大的時(shí)候,它也不會(huì)妨礙你。”
描述Pyramid的極簡(jiǎn)主義的一個(gè)好方法是“不受策略約束”,在文檔中討論P(yáng)yramid如何與其他web框架相比較的部分使用了這個(gè)術(shù)語(yǔ)。基本上,“無(wú)策略”意味著您選擇使用哪種數(shù)據(jù)庫(kù)或哪種模板語(yǔ)言不是Pyramid所關(guān)心的。
建立一個(gè)基本的Pyramid應(yīng)用程序需要非常少的工作。與Bottle和Flask一樣,除了框架本身的文件外,Pyramid應(yīng)用程序可以由單個(gè)Python文件組成。一個(gè)簡(jiǎn)單的單路由API只需要十來(lái)行代碼。大部分都是樣板文件,比如…import語(yǔ)句和設(shè)置WSGI服務(wù)器。
默認(rèn)情況下,Pyramid包括一些在web應(yīng)用程序中常見(jiàn)的事項(xiàng),但它們是作為組件提供的,并將其拼接在一起,而不是作為成熟的解決方案。例如,對(duì)用戶(hù)會(huì)話(huà)的支持甚至附帶了CSRF保護(hù)。但對(duì)用戶(hù)帳戶(hù)的支持,如登錄或帳戶(hù)管理,不在處理的一部分。你必須自己處理它或通過(guò)插件來(lái)添加支持它。表單處理和數(shù)據(jù)庫(kù)連接也是如此。
Pyramid甚至提供了一種從以前的Pyramid項(xiàng)目創(chuàng)建模板的方法來(lái)重用以前的工作。這些被稱(chēng)為“腳手架”的模板生成了一個(gè)金字塔應(yīng)用程序,具有簡(jiǎn)單的路由和一些初始HTML/CSS模板。捆綁的腳手架包括一個(gè)示例啟動(dòng)程序項(xiàng)目和一個(gè)通過(guò)流行的Python庫(kù)SQLAlchemy(
http://www.sqlalchemy.org/)連接到數(shù)據(jù)庫(kù)的項(xiàng)目。
Pyramid體貼入微的測(cè)試和調(diào)試工具提供了優(yōu)秀的功能。在Pyramid應(yīng)用程序中捆綁debugtoolbar擴(kuò)展組件,你可在每個(gè)網(wǎng)頁(yè)上得到一個(gè)可點(diǎn)擊的圖標(biāo),它會(huì)生成應(yīng)用程序執(zhí)行的詳細(xì)信息,包括發(fā)生錯(cuò)誤時(shí)的詳細(xì)回溯。還提供了日志記錄和單元測(cè)試。
Pyramid的文件是優(yōu)秀的。除了對(duì)基礎(chǔ)知識(shí)的快速瀏覽和教程風(fēng)格的演練外,還可以找到一組社區(qū)貢獻(xiàn)的教程和一本常見(jiàn)食譜式的“烹飪指南”書(shū)。后者包括了針對(duì)一系列目標(biāo)環(huán)境的部署技術(shù),從谷歌App Engine到Nginx。
Pyramid同時(shí)支持python2和python3,但是不使用python3的異步語(yǔ)法。如果想在Pyramid中利用異步,請(qǐng)參閱aiopyramid項(xiàng)目,它包括一個(gè)用于異步驅(qū)動(dòng)的“hello world”應(yīng)用程序的腳手架。
應(yīng)用示例代碼如下:
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.response import Response
def hello_world(request):
return Response('Hello World!')
if __name__ == '__main__':
with Configurator() as config:
config.add_route('hello', '/')
config.add_view(hello_world, route_name='hello')
app = config.make_wsgi_app()
server = make_server('0.0.0.0', 6543, app)
server.serve_forever()
Sanic為快速和簡(jiǎn)單而設(shè)計(jì),與Python 3.6或更高版本一起工作,并使用Python的async/await語(yǔ)法(從Python 3.5開(kāi)始可用)來(lái)讓您創(chuàng)建高效的web應(yīng)用程序。
與Flask或Bottle一樣,一個(gè)基礎(chǔ)的Sanic程序“hello world”大約需要運(yùn)行10行代碼,其中大部分是導(dǎo)入和其他樣板文件。關(guān)鍵的區(qū)別是,應(yīng)用程序路由必須聲明為異步定義函數(shù)(async def functions),并且必須在異步代碼中使用await來(lái)調(diào)用這些函數(shù)。如果您以前編寫(xiě)過(guò)異步驅(qū)動(dòng)的應(yīng)用程序,那么你應(yīng)已經(jīng)掌握了最困難的部分。
Sanic用于處理連接和響應(yīng)的許多機(jī)制大家都很熟悉。請(qǐng)求和響應(yīng)只是具有相似屬性的對(duì)象,比如上傳的文件、表單、JSON對(duì)象、頭等等。
具有許多路由的應(yīng)用程序變得難以管理。Sanic用“藍(lán)圖(blueprints)”來(lái)解決這個(gè)問(wèn)題,這些對(duì)象可以描述一組路由,并允許你通過(guò)高級(jí)界面來(lái)管理它們。不用顯式地編寫(xiě)每個(gè)路由,也不用使用過(guò)多的帶變量的路由,你可以編寫(xiě)一些藍(lán)圖來(lái)描述路由在你的應(yīng)用程序中是如何工作的(例如,/object/object_id/action)。藍(lán)圖可以有通用的中間件,如果您想將管理功能應(yīng)用到某些路由而不是其他路由,那么這是非常有用的。
Sanic還可以處理HTTP以外的協(xié)議。WebSocket端點(diǎn)只需要不同的裝飾器和更多的內(nèi)部邏輯(例如,等待和處理響應(yīng))。可以通過(guò)子類(lèi)化asyncio.protocol來(lái)支持自定義網(wǎng)絡(luò)協(xié)議。
Sanic故意省略了數(shù)據(jù)庫(kù)連接和HTML模板等功能,而保留了用于插入這些功能的特性:中間件、集中式應(yīng)用配置,等等。
示例代碼如下:
from sanic import Sanic
from sanic.response import json
app = Sanic("App Name")
@app.route("/")
async def test(request):
return json({"hello": "world"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
Tornado(
http://www.tornadoweb.org/)是另一個(gè)針對(duì)特定用例的微型框架:異步網(wǎng)絡(luò)應(yīng)用程序。Tornado非常適合創(chuàng)建那些打開(kāi)大量網(wǎng)絡(luò)連接并使其保持活力的服務(wù)——即任何涉及WebSockets或長(zhǎng)輪詢(xún)的服務(wù)。Tornado 6.0需要Python 3.5或更高版本,完全不支持Python 2。
像Bottle 或 Falcon一樣,Tornado忽略了與它的中心目的無(wú)關(guān)的特征。Tornado有一個(gè)用于生成HTML和其他輸出的內(nèi)置模板系統(tǒng),并提供了用于國(guó)際化、表單處理、cookie設(shè)置、用戶(hù)身份驗(yàn)證和CSRF保護(hù)的機(jī)制。但是它忽略了一些主要用于面向用戶(hù)的web應(yīng)用程序的特性,比如表單驗(yàn)證和ORM。
Tornado擅長(zhǎng)為需要對(duì)異步網(wǎng)絡(luò)進(jìn)行嚴(yán)密控制的應(yīng)用程序提供基礎(chǔ)設(shè)施。例如,Tornado不僅提供一個(gè)內(nèi)置的異步HTTP服務(wù)器,而且還提供一個(gè)異步HTTP客戶(hù)機(jī)。因此,Tornado非常適合構(gòu)建并行查詢(xún)其他站點(diǎn)并對(duì)返回的數(shù)據(jù)進(jìn)行操作的應(yīng)用程序,例如網(wǎng)絡(luò)爬蟲(chóng)或網(wǎng)絡(luò)機(jī)器人(web scraper或bot)。
如果您想創(chuàng)建一個(gè)使用HTTP以外的協(xié)議的應(yīng)用程序,Tornado已經(jīng)為您提供了幫助。Tornado提供對(duì)諸如DNS解析器等實(shí)用程序的低級(jí)TCP連接和套接字的訪問(wèn),以及對(duì)第三方認(rèn)證服務(wù)的訪問(wèn),它還通過(guò)WSGI標(biāo)準(zhǔn)支持與其他框架的互操作。文檔雖小但并不稀疏寬泛,其中包含了實(shí)現(xiàn)所有這些特性的豐富示例。
Tornado利用并補(bǔ)充了Python用于異步行為的本機(jī)功能。如果您使用的是Python 3.5, Tornado支持內(nèi)置的async和await關(guān)鍵字,這可以提高應(yīng)用程序的速度。您還可以使用futures或回調(diào)來(lái)處理對(duì)事件的響應(yīng)。
Tornado提供了一個(gè)同步原語(yǔ)庫(kù)(信號(hào)量、鎖等)來(lái)協(xié)調(diào)異步協(xié)程之間的事件。請(qǐng)注意,Tornado通常運(yùn)行為單線程模式,因此這些原語(yǔ)與它們的線程名稱(chēng)不同。但是,如果您希望在并行進(jìn)程中運(yùn)行Tornado以利用多個(gè)套接字和內(nèi)核,那么可以使用一些工具來(lái)實(shí)現(xiàn)這一點(diǎn)。
Tornado的文檔涵蓋了框架中的每個(gè)主要概念以及模型中的所有主要api。盡管它包含一個(gè)示例應(yīng)用程序(一個(gè)web爬蟲(chóng)),但它主要用于演示Tornado的排隊(duì)模塊。
應(yīng)用示例代碼如下:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
另外,相比前面小而美的框架較而言,Django(
https://www.djangoproject.com/)是個(gè)完整的技術(shù)棧了,基本有各種支持,悠久而龐大,這里沒(méi)有提出來(lái)更多介紹。概而言之,Django是一個(gè)高級(jí)Python Web框架,它鼓勵(lì)快速開(kāi)發(fā)和干凈、實(shí)用的設(shè)計(jì)。它由經(jīng)驗(yàn)豐富的開(kāi)發(fā)人員構(gòu)建,解決了Web開(kāi)發(fā)中的許多麻煩,因此您可以專(zhuān)注于編寫(xiě)應(yīng)用程序,而無(wú)需重新發(fā)明輪子。它是免費(fèi)和開(kāi)源的,學(xué)習(xí)曲線相對(duì)來(lái)說(shuō)較高,有興趣的可以去官網(wǎng)詳細(xì)研究一下。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。