亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Sanic教程:快速開(kāi)始

warmcheng / 2268人閱讀

摘要:快速開(kāi)始在安裝之前在支持異步的過(guò)程中,都經(jīng)歷了哪些比較重大的更新。踏出第一步我們將正式使用來(lái)構(gòu)建一個(gè)項(xiàng)目,讓我們踏出第一步,利用來(lái)編寫(xiě)一個(gè)返回字符串的服務(wù)程序。本次示例的源代碼全部在上,見(jiàn)。

快速開(kāi)始

在安裝Sanic之前,讓我們一起來(lái)看看Python在支持異步的過(guò)程中,都經(jīng)歷了哪些比較重大的更新。

首先是Python3.4版本引入了asyncio,這讓Python有了支持異步IO的標(biāo)準(zhǔn)庫(kù),而后3.5版本又提供了兩個(gè)新的關(guān)鍵字 async/await,目的是為了更好地標(biāo)識(shí)異步IO,讓異步編程看起來(lái)更加友好,最后3.6版本更進(jìn)一步,推出了穩(wěn)定版的asyncio,從這一系列的更新可以看出,Python社區(qū)正邁著堅(jiān)定且穩(wěn)重的步伐向異步編程靠近。

安裝

Sanic是一個(gè)支持 async/await 語(yǔ)法的異步無(wú)阻塞框架,這意味著我們可以依靠其處理異步請(qǐng)求的新特性來(lái)提升服務(wù)性能,如果你有Flask框架的使用經(jīng)驗(yàn),那么你可以迅速地使用Sanic來(lái)構(gòu)建出心中想要的應(yīng)用,并且性能會(huì)提升不少,我將同一服務(wù)分別用Flask和Sanic編寫(xiě),再將壓測(cè)的結(jié)果進(jìn)行對(duì)比,發(fā)現(xiàn)Sanic編寫(xiě)的服務(wù)大概是Falsk的1.5倍。

僅僅是Sanic的異步特性就讓它的速度得到這么大的提升么?是的,但這個(gè)答案并不標(biāo)準(zhǔn),更為關(guān)鍵的是Sanic使用了uvloop作為asyncio的事件循環(huán),uvloop由Cython編寫(xiě),它的出現(xiàn)讓asyncio更快,快到什么程度?這篇文章中有介紹,其中提出速度至少比 nodejs、gevent 和其他Python異步框架要快兩倍,并且性能接近于用Go編寫(xiě)的程序,順便一提,Sanic的作者就是受這篇文章影響,這才有了Sanic。

怎么樣?有沒(méi)有激起你學(xué)習(xí)Sanic的興趣,如果有,就讓我們一起開(kāi)始學(xué)習(xí)吧,在開(kāi)始之前,你只需要有一臺(tái)安裝了Python的電腦即可。

說(shuō)明:由于Windows下暫不支持安裝uvloop,故在此建議使用Mac或Linux
虛擬環(huán)境

程序世界一部分是對(duì)應(yīng)著現(xiàn)實(shí)的,在生活中,我們會(huì)在不同的環(huán)境完成不同的任務(wù),比如在廚房做飯、臥室休息,分工極其明確。

其實(shí)用Python編寫(xiě)應(yīng)用服務(wù)也是如此,它們同樣希望應(yīng)用服務(wù)與開(kāi)發(fā)環(huán)境是一對(duì)一的關(guān)系,這樣做的好處在于,每個(gè)獨(dú)立的環(huán)境都可以簡(jiǎn)潔高效地管理自身對(duì)應(yīng)服務(wù)所依賴(lài)的第三方庫(kù),如若不然,各個(gè)服務(wù)都安排在同一環(huán)境,這樣不僅會(huì)造成管理上的麻煩,還會(huì)使第三方庫(kù)之間產(chǎn)生沖突。

通過(guò)上面的敘述,我們是不是可以得出這樣一個(gè)核心觀點(diǎn):應(yīng)該在不同的環(huán)境下做不同的事 ,以此類(lèi)推,寫(xiě)項(xiàng)目的時(shí)候,我們也需要為每個(gè)不同的項(xiàng)目構(gòu)建一個(gè)無(wú)干擾的的環(huán)境,發(fā)散思維,總結(jié)一下:

不同的項(xiàng)目,需要為其構(gòu)建不同的虛擬環(huán)境,以免互相干擾

構(gòu)建虛擬環(huán)境的工具很多,如下:

virtualenv

pyenv

anaconda

…...

以上三個(gè)工具都可以快速地幫助我們構(gòu)建當(dāng)前需要的Python環(huán)境,如果你之前沒(méi)有使用過(guò),可直接點(diǎn)開(kāi)鏈接進(jìn)行下載,如果你正在使用其它的環(huán)境管理工具,也不要緊,因?yàn)椴徽撃闶褂媚囊环N方式,我們最終目的都是針對(duì)一個(gè)新項(xiàng)目構(gòu)建一個(gè)新的環(huán)境。

安裝配置好之后,簡(jiǎn)單看看官方提供的使用方法,就可以開(kāi)始了,比如我本機(jī)使用的是anaconda ,安裝完成后可以很方便地創(chuàng)建一個(gè)虛擬環(huán)境,比如這里使用Python3.6來(lái)作為本書(shū)項(xiàng)目的默認(rèn)環(huán)境:

# 新建一個(gè)python3.6環(huán)境
conda create --name python36 python=3.6
# 安裝好之后 輸入下面命令進(jìn)入名為python36的環(huán)境
source activate python36

若安裝速度比較慢,可以考慮換國(guó)內(nèi)源,比如 國(guó)內(nèi)鏡像 ,至于為什么選擇python3.6作為默認(rèn)環(huán)境,一是因?yàn)镾anic只支持Python3.5+,二則是我們構(gòu)建的項(xiàng)目最終是要在生產(chǎn)環(huán)境下運(yùn)行的,所以建議最好安裝Python3.6下穩(wěn)定版本的asyncio

安裝Sanic

Python安裝第三方模塊都是利用pip工具進(jìn)行安裝,這里也不例外,首先進(jìn)入上一步我們新建的 python3.6 虛擬環(huán)境,然后安裝:

# 安裝Sanic,請(qǐng)先使用 source activate python36 進(jìn)入虛擬環(huán)境
pip install sanic
# 如果不想使用uvloop和ujson 可以這樣安裝
SANIC_NO_UVLOOP=true SANIC_NO_UJSON=true pip install sanic

通過(guò)上面的命令,你就可以在 python3.6 虛擬環(huán)境中安裝Sanic以及其依賴(lài)的第三方庫(kù)了,若想查看Sanic是否已經(jīng)正確安裝,可以進(jìn)入終端下對(duì)應(yīng)的虛擬環(huán)境,啟動(dòng)Python解釋器,導(dǎo)入Sanic庫(kù):

# 啟動(dòng)Python解釋器
python
>>> import sanic
>>>

如果沒(méi)有出現(xiàn)錯(cuò)誤,就說(shuō)明你已經(jīng)正確地安裝了Sanic,請(qǐng)繼續(xù)閱讀下一節(jié),了解下如何利用Sanic來(lái)構(gòu)建一個(gè)Web項(xiàng)目吧。

踏出第一步

我們將正式使用Sanic來(lái)構(gòu)建一個(gè)web項(xiàng)目,讓我們踏出第一步,利用Sanic來(lái)編寫(xiě)一個(gè)返回Hello World!字符串的服務(wù)程序。

新建一個(gè)文件,名為 run.py :

#!/usr/bin/env python
from sanic import Sanic
from sanic.response import text

app = Sanic()


@app.route("/")
async def test(request):
    return text("Hello World!")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

Sanic的目標(biāo)是讓編寫(xiě)服務(wù)更加簡(jiǎn)單易用,請(qǐng)看上面僅用不到10行的代碼,就編寫(xiě)好了一個(gè)簡(jiǎn)單的Web服務(wù),運(yùn)行此文件,在瀏覽器輸入 http://0.0.0.0:8000 ,出現(xiàn)的字符會(huì)讓你回想起當(dāng)年學(xué)c的恐懼^_^。

如果你是第一次使用Sanic,上面的代碼可能會(huì)讓你產(chǎn)生一些困擾,不用擔(dān)心,接下來(lái),我們將一起用Sanic編寫(xiě)一個(gè)簡(jiǎn)單的資訊閱讀的web服務(wù),在這過(guò)程中,你將逐漸地了解到Sanic的一些基本用法,如路由的構(gòu)建、接受請(qǐng)求數(shù)據(jù)以及返回響應(yīng)的內(nèi)容等。

本次示例的源代碼全部在github上,見(jiàn)examples/demo01/news.py。

編寫(xiě)一個(gè)資訊閱讀項(xiàng)目

在開(kāi)始編寫(xiě)之前,第一步最好寫(xiě)一下需求,哪怕是個(gè)簡(jiǎn)單不過(guò)的玩具項(xiàng)目也不能略過(guò)這個(gè)步驟,比如現(xiàn)在編寫(xiě)的資訊閱讀項(xiàng)目,需求就一個(gè),在頁(yè)面中展示一些資訊新聞。

既然是展示資訊新聞,那么解決數(shù)據(jù)來(lái)源的問(wèn)題最為重要,對(duì)于這個(gè)問(wèn)題你也不用擔(dān)心,因?yàn)樵诒敬问纠脑创a中我編寫(xiě)了一個(gè)名為get_news()的函數(shù)專(zhuān)門(mén)用來(lái)返回資訊新聞數(shù)據(jù),簡(jiǎn)化代碼如下:

async def get_news(size=10):
    """
    Sanic是一個(gè)異步框架,為了更好的發(fā)揮它的性能,有些操作最好也要用異步的
    比如這里發(fā)起請(qǐng)求就必須要用異步請(qǐng)求框架aiohttp
    所以使用本服務(wù)的時(shí)候請(qǐng)先執(zhí)行: pip install aiohttp
    數(shù)據(jù)使用的是readhub網(wǎng)站的api接口
    為了使這個(gè)數(shù)據(jù)獲取函數(shù)正常運(yùn)行,我會(huì)保持更新,所以具體代碼:examples/demo01/news.py
    """
    async with aiohttp.ClientSession() as client:
        async with client.get(readhub_api, params=params, headers=headers) as response:
            assert response.status == 200
            text = await response.json()
        return text

這樣各位就可以只專(zhuān)注于Sanic的代碼實(shí)現(xiàn),而不必考慮其他問(wèn)題,我會(huì)一直維護(hù)這個(gè)數(shù)據(jù)獲取函數(shù),以保證數(shù)據(jù)正常輸出,各位請(qǐng)放心使用。

構(gòu)建路由

數(shù)據(jù)的問(wèn)題解決之后,我們可以開(kāi)始著手于需求的實(shí)現(xiàn)了,根據(jù)前面的描述,此時(shí)的需求是當(dāng)客戶(hù)端(Web瀏覽器)訪問(wèn)http://0.0.0.0:8000/的時(shí)候,瀏覽器會(huì)立馬展示服務(wù)端響應(yīng)返回的10條資訊新聞(假設(shè)內(nèi)容由index()函數(shù)返回),若瀏覽器訪問(wèn)的是http://0.0.0.0:8000/2,此時(shí)返回的就是第二頁(yè)的10條資訊新聞,以此類(lèi)推......

當(dāng)Sanic程序?qū)嵗邮盏揭粋€(gè)請(qǐng)求,比如前面提到的http://0.0.0.0:8000/,它是怎么知道這個(gè)URL可以對(duì)應(yīng)到index()函數(shù)呢?

Sanic有一個(gè)機(jī)制來(lái)保存URL和函數(shù)(一般稱(chēng)之為視圖函數(shù))之間的映射關(guān)系,就像dictkeyvalue,這樣當(dāng)服務(wù)端接收到請(qǐng)求http://0.0.0.0:8000/,就會(huì)立馬知道,接下來(lái)需要調(diào)用index()函數(shù)了,我們將其稱(chēng)之為路由。

Sanic中可以用app.route修飾器來(lái)定義路由,當(dāng)Sanic服務(wù)啟動(dòng)的時(shí)候,app.route就會(huì)將其中傳入的參數(shù)與裝飾的函數(shù)自動(dòng)注冊(cè)好,比如下面這段代碼:

@app.route("/")
async def index(request):
    """當(dāng)服務(wù)端接收到客戶(hù)端的/請(qǐng)求時(shí),就會(huì)調(diào)用此函數(shù)"""
    return text("Hello World!")

此時(shí)請(qǐng)求http://0.0.0.0:8000/就會(huì)返回Hello World!,很顯然,這不是我們想要的需求,我們的需求是展示10條資訊新聞,數(shù)據(jù)怎么來(lái)?你只需要調(diào)用get_news()函數(shù),就會(huì)獲取到你想要的資訊數(shù)據(jù):

@app.route("/")
async def index(request):
    # html頁(yè)面模板
    html_tem = """
    

{title}

{summary}

{updated_at}

""" html_list = [] # 獲取數(shù)據(jù) all_news = await get_news() # 生成在瀏覽器展示的html頁(yè)面 for each_news in all_news: html_list.append(html_tem.format( href=each_news.get("news_info", [{}])[0].get("url", "#"), title=each_news.get("title"), summary=each_news.get("summary"), updated_at=each_news.get("updated_at"), )) return html("
".join(html_list))

運(yùn)行此服務(wù):

python run news.py

此時(shí),訪問(wèn)http://0.0.0.0:8000/,你就會(huì)獲得Sanic服務(wù)程序返回的資訊新聞,如下圖,可以看到返回服務(wù)端提供的最新資訊:

頁(yè)面成功地呈現(xiàn)出我們想要的結(jié)果,實(shí)在是令人興奮,等等,不能高興太早,我們還有一個(gè)需求,要根據(jù)瀏覽器輸入的頁(yè)數(shù)來(lái)展示內(nèi)容,如:http://0.0.0.0:8000/2,思考一下,應(yīng)該怎樣優(yōu)雅地完成這個(gè)需求,或許你會(huì)想,再構(gòu)建一對(duì)URL與視圖函數(shù)的映射關(guān)系,像下面這樣:

@app.route("/2")
async def page_2(request):

不得不說(shuō),這是一個(gè)糟糕的解決方案,這樣沒(méi)法解決接下來(lái)的第3頁(yè)、第4頁(yè)、甚至第n頁(yè)(雖然目前這個(gè)服務(wù)程序只展示到第2頁(yè)),最佳實(shí)踐應(yīng)該是把頁(yè)數(shù)當(dāng)做變量來(lái)獲取,Sanic的路由機(jī)制自然提供了獲取動(dòng)態(tài)請(qǐng)求參數(shù)的功能,如下:

@app.route("/")
@app.route("/")
async def index(request, page=1):
    """
    支持/請(qǐng)求與/page請(qǐng)求方式
    具體的代碼邏輯也會(huì)有一點(diǎn)改變,可參考:examples/demo01/news.py
    """

再次運(yùn)行此服務(wù):

python run news.py

不論是請(qǐng)求http://0.0.0.0:8000/或者http://0.0.0.0:8000/2,都是我們想要的結(jié)果。

請(qǐng)求數(shù)據(jù)

細(xì)心的你可能會(huì)發(fā)現(xiàn),每次編寫(xiě)一個(gè)視圖函數(shù)的時(shí)候,總是有一個(gè)request參數(shù):

async def index(request, page=1):

為什么必須定義這個(gè)參數(shù),它從哪來(lái)?它有什么作用,下面我將一一為你解答。

如果你在客戶(hù)端請(qǐng)求http://0.0.0.0:8000/的時(shí)候,順手在視圖函數(shù)里面打印下參數(shù)request,會(huì)有如下輸出:

看終端的輸出可以了解到request參數(shù)實(shí)際上是一個(gè)名為Request的實(shí)例對(duì)象,每當(dāng)服務(wù)端接收到一個(gè)請(qǐng)求,Sanic的handle_request函數(shù)必定會(huì)接收一個(gè)Request實(shí)例對(duì)象,這個(gè)實(shí)例對(duì)象包含了一系列請(qǐng)求信息。

前面說(shuō)到,每個(gè)URL對(duì)應(yīng)一個(gè)視圖函數(shù),而Sanic的handle_request接下來(lái)會(huì)將接收的Request實(shí)例對(duì)象作為參數(shù)傳給URL對(duì)應(yīng)的視圖函數(shù),也就是上面indexrequest參數(shù),這樣一來(lái),就必須定義request來(lái)接收Request實(shí)例對(duì)象,其中包含的一些請(qǐng)求信息對(duì)視圖函數(shù)來(lái)說(shuō)非常重要,目前Request對(duì)象提供了以下屬性:

json

token

form

files

args

raw_args

cookies

ip

port

socket

remote_addr

path

url

上面只是列出了一部分屬性,如果你想了解更多,可查看request.py源碼文件了解。

為了可以實(shí)際使用下request,我們可以再加一個(gè)需求,比如增加一個(gè)GET請(qǐng)求的接口http://0.0.0.0:8000/json,如果請(qǐng)求不設(shè)置參數(shù)nums的值,則默認(rèn)返回一條資訊新聞,如果設(shè)置了nums參數(shù),則該接口返回的新聞數(shù)量由參數(shù)值決定,參數(shù)最大值為10:

@app.route("/json")
async def index_json(request):
    """
    默認(rèn)返回一條資訊,最多十條
    """
    nums = request.args.get("nums", 1)
    # 獲取數(shù)據(jù)
    all_news = await get_news()
    try:
        return json(random.sample(all_news, int(nums)))
    except ValueError:
        return json(all_news)

運(yùn)行此服務(wù):

python run news.py

此時(shí)視圖函數(shù)index_json就可以根據(jù)接受的參數(shù)nums來(lái)返回對(duì)應(yīng)數(shù)量的新聞,訪問(wèn)http://0.0.0.0:8000/json?nums=2,效果如下:

響應(yīng)

不論哪個(gè)Web框架,都是需要構(gòu)建響應(yīng)對(duì)象的,Sanic自然也不例外,它用的是sanic.response來(lái)構(gòu)建響應(yīng)對(duì)象,像上面的代碼中可以看到:

from sanic.response import html, json

這表示我們目前構(gòu)建的資訊閱讀服務(wù),分別返回了body格式為html以及json的響應(yīng)對(duì)象,除了這兩種格式,Sanic還提供了下面幾種格式:

json

text

raw

html

file

file_stream

stream

更多屬性請(qǐng)看response.py,我們可以根據(jù)實(shí)際需求來(lái)構(gòu)建響應(yīng)對(duì)象,最后再返回給客戶(hù)端。

繼續(xù)深入

不要以為現(xiàn)在編寫(xiě)的資訊服務(wù)已經(jīng)很完善了,其實(shí)還有許多問(wèn)題需要我們解決,比如訪問(wèn)http://0.0.0.0:8000/html這個(gè)URL會(huì)返回:

Error: Requested URL /html not found

服務(wù)程序?yàn)槭裁磿?huì)拋出這個(gè)錯(cuò)誤?因?yàn)槌绦蛑胁⒙酚蓻](méi)有注冊(cè)html,并且沒(méi)有進(jìn)行錯(cuò)誤捕捉(比如此時(shí)的404),解決這個(gè)問(wèn)題也很方便,比如把這個(gè)錯(cuò)誤全部跳轉(zhuǎn)到首頁(yè),代碼如下:

@app.exception(NotFound)
def ignore_404s(request, exception):
    return redirect("/")

此時(shí)訪問(wèn)一些沒(méi)有注冊(cè)于路由的URL,比如此時(shí)的http://0.0.0.0:8000/html都會(huì)自動(dòng)跳轉(zhuǎn)到http://0.0.0.0:8000/。

現(xiàn)在,我們已經(jīng)用Sanic編寫(xiě)了一個(gè)簡(jiǎn)單的資訊閱讀服務(wù),在編寫(xiě)的過(guò)程中使用了路由、數(shù)據(jù)請(qǐng)求、處理以及響應(yīng)對(duì)象,這些基礎(chǔ)知識(shí)足夠你編寫(xiě)一些基本的服務(wù),但這還遠(yuǎn)遠(yuǎn)不夠,比如模板引、引入靜態(tài)文件等,這些都等著我們?cè)趯?shí)踐中繼續(xù)深入了解。

總結(jié)

本章介紹了Sanic的安裝以及基本的使用,目標(biāo)是希望諸位可以迅速的了解并掌握Sanic的基本使用方法,并為閱讀接下來(lái)的章節(jié)打一下基礎(chǔ)。

文檔以及代碼:

Sanic github地址:https://github.com/channelcat...

官方教程:http://sanic.readthedocs.io/e...

demo地址:demo01

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/41300.html

相關(guān)文章

  • Sanic教程:配置

    摘要:?jiǎn)我慌渲脭]起袖子,開(kāi)始吧,新建文件夾,內(nèi)部建立這樣的文件結(jié)構(gòu)其中內(nèi)容如下代碼示例中開(kāi)啟了模式,假設(shè)我們需要通過(guò)配置文件來(lái)實(shí)現(xiàn)控制服務(wù)的模式開(kāi)啟與否,那該怎么實(shí)現(xiàn)呢。 配置 對(duì)于一個(gè)項(xiàng)目來(lái)說(shuō),配置是一個(gè)很?chē)?yán)肅的問(wèn)題,比如說(shuō):在開(kāi)發(fā)環(huán)境和生產(chǎn)環(huán)境中,配置是不同的,那么一個(gè)項(xiàng)目該如何自由地在不同的配置環(huán)境中進(jìn)行切換呢,思考下,然后帶著答案或者疑問(wèn)往下閱讀。 單一配置 擼起袖子,開(kāi)始吧,新建文...

    binta 評(píng)論0 收藏0
  • 基于python3.5+的web框架sanic中文入門(mén)教程

    摘要:簡(jiǎn)介是一款用寫(xiě)的,用法和類(lèi)似,的特點(diǎn)是非常快官網(wǎng)速度比較框架實(shí)現(xiàn)基礎(chǔ)每秒請(qǐng)求數(shù)平均時(shí)間安裝環(huán)境創(chuàng)建文件,寫(xiě)入下面的內(nèi)容運(yùn)行是不是看起來(lái)和一樣屬性上傳文件列表數(shù)據(jù)數(shù)據(jù)表單數(shù)據(jù)例子路由和差不多,一看就懂注冊(cè)中間件異常處 簡(jiǎn)介 sanic是一款用python3.5+寫(xiě)的web framework,用法和flask類(lèi)似,sanic的特點(diǎn)是非常快github官網(wǎng):https://github.c...

    booster 評(píng)論0 收藏0
  • python 最快 web 框架 Sanci 快速入門(mén)

    摘要:詳細(xì)信息可以看下這個(gè)問(wèn)題先在說(shuō)下我的部署方式使用部署配置文件啟動(dòng)方式總結(jié)試用了下,把之前的一個(gè)聊天機(jī)器人從改成了。預(yù)告下一篇將介紹如何使用一步一步創(chuàng)建一個(gè)聊天機(jī)器人。 簡(jiǎn)介 Sanic 是一個(gè)和類(lèi)Flask 的基于Python3.5+的web框架,它編寫(xiě)的代碼速度特別快。除了像Flask 以外,Sanic 還支持以異步請(qǐng)求的方式處理請(qǐng)求。這意味著你可以使用新的 async/await ...

    snifes 評(píng)論0 收藏0
  • 使用Sanic開(kāi)發(fā)快速異步響應(yīng)的Web程序

    摘要:在類(lèi)似的基礎(chǔ)上,支持異步請(qǐng)求處理,也就是說(shuō),你可以使用中全新而又亮眼的語(yǔ)法,使你的代碼非阻塞且快速。就是基于實(shí)現(xiàn)的異步讀寫(xiě)的數(shù)據(jù)庫(kù)模塊,同樣有模塊為因一波封裝了,使得讀寫(xiě)更加方便,它就是 Sanic是一個(gè)類(lèi)似Flask、僅僅支持Python 3.5+ 版本的web 服務(wù)器,旨在運(yùn)行速度更快。在類(lèi)似Flask的基礎(chǔ)上,Sanic支持異步請(qǐng)求處理,也就是說(shuō),你可以使用Python 3.5 ...

    clasnake 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<