Sanic框架請(qǐng)求與響應(yīng)實(shí)例分析
本文實(shí)例講述了Sanic框架請(qǐng)求與響應(yīng)。分享給大家供大家參考,具體如下:
前面介紹了Sanic框架的路由,這里接著介紹Sanic框架的請(qǐng)求與響應(yīng)。
簡(jiǎn)介
Sanic是一個(gè)類(lèi)似Flask的Python 3.5+ Web服務(wù)器,它的寫(xiě)入速度非???。除了Flask之外,Sanic還支持異步請(qǐng)求處理程序。這意味著你可以使用Python 3.5中新的閃亮的異步/等待語(yǔ)法,使你的代碼非阻塞和快速。
前言:Sanic最低支持Python 3.5,如果需要學(xué)習(xí)Sanic,請(qǐng)先下載版本不低于3.5的Python包
請(qǐng)求數(shù)據(jù)
當(dāng)一個(gè)端點(diǎn)收到一個(gè)HTTP請(qǐng)求時(shí),路由功能被傳遞到一個(gè)request對(duì)象。以下變量可以作為request對(duì)象的屬性訪問(wèn):
- json:JSON數(shù)據(jù)
@app.route("/post_data",methods=["POST"])
async def post_data(request):
# 將打印傳遞過(guò)來(lái)的JSON數(shù)據(jù)
print(request.json)
return text("it is ok!")
- args:查詢(xún)字符串變量。查詢(xún)字符串是類(lèi)似于URL的部分
?name=laozhang&age=20。如果URL被解析,那么args字典將如下所示:{"name":["laozhang"],"age":[20]} - raw_args:在許多情況下,我們需要獲取壓縮程度低的字典中的url參數(shù)。對(duì)于之前的
URL?name=laozhang&age=20,raw_args字典將如下所示:{"name":"laozhang","age":20} - file:文件對(duì)象字典,具有名稱(chēng),正文和類(lèi)型的文件列表
@app.route("/post_file_data",methods=["POST"])
async def post_file_data(request):
info = request.files.get("file")
print(info.name)
print(info.type)
print(info.body)
return text("it is ok!")
- form:表單數(shù)據(jù),form字典將如下所示:
{"name":["laozhang"]}
@app.route("/post_form_data",methods=["POST"])
async def post_form_data(request):
name = request.form.get("name")
return text("it is ok!")
- body:原始數(shù)據(jù)。無(wú)論內(nèi)容類(lèi)型如何,該屬性都允許檢索請(qǐng)求的原始數(shù)據(jù)。
byte類(lèi)型 - headers:獲取請(qǐng)求表頭的不區(qū)分大小寫(xiě)的字典。
dict類(lèi)型 - ip:IP地址,
str類(lèi)型 - port:端口,
str類(lèi)型 - socket:請(qǐng)求者的IP地址和端口,(IP地址,端口)。
tuple類(lèi)型 - app:對(duì)處理請(qǐng)求的Sanic應(yīng)用程序?qū)ο蟮囊谩?/li>
@appr.route("/get_app_info")
async def get_app_info(request):
print(request.app.config)
return text("it is ok!")
- url:請(qǐng)求的完整URL,如:http://localhost:5000/get_app_info
- scheme:獲取與請(qǐng)求關(guān)聯(lián)的URL方案:
http或https - host:獲取與請(qǐng)求關(guān)聯(lián)的主機(jī)
- path:獲取請(qǐng)求的路徑,如:
/get_app_info - query_string:獲取查詢(xún)的字符串,如:
name=zhangsan或者為一個(gè)空白字符串 - uri_template:獲取匹配路由處理程序的模板,如:
/get/<id> - token:授權(quán)標(biāo)頭的值
get與getlist
當(dāng)我們?cè)L問(wèn)一個(gè)GET請(qǐng)求,并傳入相關(guān)參數(shù)時(shí),如下的請(qǐng)求:
@app.route("/get_info")
async def get_info(request):
print(request.args.get("name"))
print(request.args.getlist("name")
return text("it is ok!")
當(dāng)我們傳入一個(gè)name為laozhang時(shí),在上面有提到,args字典將會(huì)是{"name":["laozhang"],所以,訪問(wèn)上面的路由,將會(huì)打印如下結(jié)果:
laozhang
["laozhang"]
響應(yīng)
使用sanic.response模塊中的函數(shù)來(lái)創(chuàng)建響應(yīng)
純文本:
from sanic.response import text
@app.route("/text")
async def get_text(request):
return text("it is text response!")
HTML:
from sanic.response import html
@app.route("/html")
async def get_html(request):
return html("<p>it is html!</p>")
JSON:
from sanic.response import json
@app.route("/json")
async def get_json(request):
return json({"name":"laozhang"})
FILE:
from sanic.response import file
@app.route("/file")
async def get_file(request):
return await file("/xx/aa/abc.png")
切記,不能少了await關(guān)鍵字
STREAM:
from sanic.response import stream
@app.route("/stream")
async def get_stream(request):
async def stream_fn(response):
response.write("abc")
response.write("def")
return stream(stream_fn,content_type="text/plain")
文件流:針對(duì)大文件,上面文件與流的組合
from sanic.response import file_stream
@app.route("/file_stream")
async def get_file_stream(request):
return await file_stream("/xx/aa/abc.png")
切記,不能少了await關(guān)鍵字
重定向:
from sanic.response import redirect
@app.route("/redirect")
async def get_redirect(request):
return redirect("/json")
RAW:未編碼的body響應(yīng)
from sanic.response import raw
@app.route("/raw")
async def get_raw(request):
return raw(b"it is raw data")
訪問(wèn)此接口后,將會(huì)立即下載一個(gè)名為raw的文件,里面包含內(nèi)容it is raw data
修改請(qǐng)求頭和狀態(tài)值:如果需要修改請(qǐng)求頭和狀態(tài)值,請(qǐng)將headers和status參數(shù)傳遞給上面這些函數(shù),下面以json為例
from sanic.response import json
@app.route("/json")
async def get_json(request):
return json({"name":"老張"},headers={"age":18},status=403)
訪問(wèn)此接口后,會(huì)發(fā)現(xiàn)原來(lái)本應(yīng)是200的狀態(tài)值變成了403,而且請(qǐng)求頭信息中增加了{"age":18}
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專(zhuān)題:《Python入門(mén)與進(jìn)階經(jīng)典教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
python使用布隆過(guò)濾器的實(shí)現(xiàn)示例
這篇文章主要介紹了python使用布隆過(guò)濾器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
基于Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題的解決方法
下面小編就為大家?guī)?lái)一篇基于Linux系統(tǒng)中python matplotlib畫(huà)圖的中文顯示問(wèn)題的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
pytorch?collate_fn的基礎(chǔ)與應(yīng)用教程
這篇文章主要給大家介紹了關(guān)于pytorch?collate_fn基礎(chǔ)與應(yīng)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
python每5分鐘從kafka中提取數(shù)據(jù)的例子
今天小編就為大家分享一篇python每5分鐘從kafka中提取數(shù)據(jù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
簡(jiǎn)單了解python gevent 協(xié)程使用及作用
這篇文章主要介紹了簡(jiǎn)單了解python gevent 協(xié)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07

