成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Sanic教程:快速開始

warmcheng / 2169人閱讀

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

快速開始

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

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

安裝

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

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

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

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

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

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

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

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

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

virtualenv

pyenv

anaconda

…...

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

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

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

若安裝速度比較慢,可以考慮換國內(nèi)源,比如 國內(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,請先使用 source activate python36 進(jìn)入虛擬環(huán)境
pip install sanic
# 如果不想使用uvloop和ujson 可以這樣安裝
SANIC_NO_UVLOOP=true SANIC_NO_UJSON=true pip install sanic

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

# 啟動Python解釋器
python
>>> import sanic
>>>

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

踏出第一步

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

新建一個文件,名為 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)是讓編寫服務(wù)更加簡單易用,請看上面僅用不到10行的代碼,就編寫好了一個簡單的Web服務(wù),運(yùn)行此文件,在瀏覽器輸入 http://0.0.0.0:8000 ,出現(xiàn)的字符會讓你回想起當(dāng)年學(xué)c的恐懼^_^。

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

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

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

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

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

async def get_news(size=10):
    """
    Sanic是一個異步框架,為了更好的發(fā)揮它的性能,有些操作最好也要用異步的
    比如這里發(fā)起請求就必須要用異步請求框架aiohttp
    所以使用本服務(wù)的時候請先執(zhí)行: pip install aiohttp
    數(shù)據(jù)使用的是readhub網(wǎng)站的api接口
    為了使這個數(shù)據(jù)獲取函數(shù)正常運(yùn)行,我會保持更新,所以具體代碼: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

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

構(gòu)建路由

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

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

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

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

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

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

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

{title}

{summary}

{updated_at}

""" html_list = [] # 獲取數(shù)據(jù) all_news = await get_news() # 生成在瀏覽器展示的html頁面 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

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

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

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

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

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

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

python run news.py

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

請求數(shù)據(jù)

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

async def index(request, page=1):

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

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

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

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

json

token

form

files

args

raw_args

cookies

ip

port

socket

remote_addr

path

url

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

為了可以實(shí)際使用下request,我們可以再加一個需求,比如增加一個GET請求的接口http://0.0.0.0:8000/json,如果請求不設(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ù)index_json就可以根據(jù)接受的參數(shù)nums來返回對應(yīng)數(shù)量的新聞,訪問http://0.0.0.0:8000/json?nums=2,效果如下:

響應(yīng)

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

from sanic.response import html, json

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

json

text

raw

html

file

file_stream

stream

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

繼續(xù)深入

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

Error: Requested URL /html not found

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

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

此時訪問一些沒有注冊于路由的URL,比如此時的http://0.0.0.0:8000/html都會自動跳轉(zhuǎn)到http://0.0.0.0:8000/。

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

總結(jié)

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

文檔以及代碼:

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

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

demo地址:demo01

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/41300.html

相關(guān)文章

  • Sanic教程:配置

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

    binta 評論0 收藏0
  • 基于python3.5+的web框架sanic中文入門教程

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

    booster 評論0 收藏0
  • python 最快 web 框架 Sanci 快速入門

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

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

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

    clasnake 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<