Python使用Quart作為web服務(wù)器的代碼實現(xiàn)
一、Quart 輕量級web框架介紹
Quart 是一個異步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是傳統(tǒng)的 WSGI(Web Server Gateway Interface)。這使得 Quart 特別適合用于構(gòu)建需要處理大量并發(fā)連接的高性能 Web 應(yīng)用程序。與 Flask 類似,Quart 也非常靈活,可以輕松地構(gòu)建 RESTful API、WebSockets、HTTP/2 服務(wù)器推送等。
1、異步支持
由于 Quart 是基于異步 IO 設(shè)計的,因此你可以在處理請求時使用 async
和 await
關(guān)鍵字來執(zhí)行異步操作,例如訪問數(shù)據(jù)庫或調(diào)用其他異步服務(wù)。這使得 Quart 非常適合用于構(gòu)建需要高并發(fā)處理的應(yīng)用程序。
2、WebSocket支持
Quart提供了對WebSocket協(xié)議的原生支持,使得實時通信和推送功能更加簡單可行。這對于需要實時交互的應(yīng)用,如聊天室、在線游戲等,具有極大的便利性。
3、與 Flask 的比較
Quart框架與廣受歡迎的Flask框架具有API兼容性,這意味著開發(fā)者可以輕松地將現(xiàn)有的Flask應(yīng)用遷移到Quart上,并享受異步編程帶來的好處。這一特性降低了學(xué)習(xí)成本,并使得開發(fā)者能夠更快速地適應(yīng)Quart。
它們之間有一些關(guān)鍵的區(qū)別:
- 異步支持:Quart 是基于異步 IO 設(shè)計的,而 Flask 是基于同步 IO。這使得 Quart 在處理大量并發(fā)連接時性能更好。
- ASGI 與 WSGI:Quart 使用 ASGI 接口,而 Flask 使用 WSGI 接口。ASGI 提供了對 HTTP/2、WebSockets 和其他協(xié)議的原生支持。
- 性能:由于 Quart 的異步特性,它在處理大量并發(fā)連接時通常比 Flask 更快。
- 生態(tài):Flask 有一個龐大的社區(qū)和豐富的擴(kuò)展庫,而 Quart 作為較新的框架,其生態(tài)還在不斷發(fā)展中。
二、使用示例
安裝 quart
示例1:返回json數(shù)據(jù)
import logging from quart import Quart, render_template, request, jsonify app = Quart(__name__) app.logger.setLevel(logging.INFO) # 設(shè)置 Quart 日志記錄器的級別為 INFO # 返回 html 模板 @app.route('/') async def index(): app.logger.info('Quart index load success ') return 'Hello, Quart!' # GET請求,返回json數(shù)據(jù) @app.route('/get', methods=['GET']) async def handle_get(): data = {'name': 'Jacky', 'sex': 'Male'} return jsonify(data), 200 # 定義一個處理POST請求的路由 @app.route('/post', methods=['POST']) async def handle_post(): data = await request.get_json() # 異步獲取POST請求的JSON數(shù)據(jù) # 假設(shè)我們只是將接收到的數(shù)據(jù)返回給客戶端 return jsonify(data), 201 # 返回狀態(tài)碼201表示成功創(chuàng)建了資源 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
示例2:返回html模板
以下是一個使用Quart和Jinja2模板引擎的簡單代碼示例:
首先,確保你已經(jīng)安裝了quart
和jinja2
。你可以使用pip來安裝它們(如果尚未安裝):
pip install quart jinja2
然后,創(chuàng)建一個簡單的Quart應(yīng)用,該應(yīng)用使用Jinja2模板來渲染一個HTML頁面。
from quart import Quart, render_template, request app = Quart(__name__) @app.route('/') async def index(): # 渲染index.html模板,并傳遞一些變量給模板 return await render_template('index.html', name='Quart User', framework='Quart') if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
在這個例子中,我們創(chuàng)建了一個Quart應(yīng)用,Quart默認(rèn)會加加載名為 templates 的文件夾中的模板。
接下來,我們定義了一個路由處理函數(shù)index,它使用render_template函數(shù)來渲染名為index.html的模板。我們還傳遞了兩個變量name和framework給模板,這些變量將在模板中被替換。
你需要在項目的根目錄下創(chuàng)建一個名為templates的文件夾,并在其中創(chuàng)建一個index.html文件,例如:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ framework }} Welcome</title> </head> <body> <h1>Welcome, {{ name }}!</h1> <p>You are using the {{ framework }} framework.</p> </body> </html>
在這個HTML模板中,{{ name }}和{{ framework }}是變量占位符,它們將被render_template函數(shù)調(diào)用時傳遞的實際變量值替換。
當(dāng)你運行上面的Quart應(yīng)用并訪問http://localhost:5000/時,你應(yīng)該會看到一個歡迎頁面,其中包含了通過Jinja2模板引擎動態(tài)插入的name和framework變量的值。
示例3:websocket使用
1)創(chuàng)建websocket服務(wù)
from quart import Quart, websocket, request app = Quart(__name__) @app.websocket('/ws') async def ws(): await websocket.accept() while True: data = await websocket.receive() print(f"Received from client: {data}") if data is None: # 客戶端斷開連接 break # 處理接收到的數(shù)據(jù),這里我們只是簡單地將數(shù)據(jù)回顯給客戶端 await websocket.send(data) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)
2)使用Python websocket創(chuàng)建client端,發(fā)送和接收websocket消息
首先,確保你已經(jīng)安裝了websockets庫。如果沒有安裝,你可以通過pip來安裝它:
pip install websockets
import asyncio import websockets async def websocket_client(): uri = "ws://localhost:5000/ws" async with websockets.connect(uri) as websocket: # 發(fā)送一條消息到服務(wù)器 await websocket.send("Hello, Server!") # 接收服務(wù)器的響應(yīng) response = await websocket.recv() print(f"Received from server: {response}") # 可以繼續(xù)發(fā)送和接收更多的消息 # ... # 運行客戶端 asyncio.run(websocket_client())
上面代碼,首先導(dǎo)入了asyncio和websockets庫。然后,定義了一個異步函數(shù)websocket_client,使用websockets.connect函數(shù)連接到WebSocket服務(wù)器。連接建立后,通過websocket.send方法發(fā)送一條消息給服務(wù)器,并通過websocket.recv方法等待并接收服務(wù)器的響應(yīng)。最后,使用asyncio.run函數(shù)來運行這個異步客戶端。
3)運行代碼,得到如下輸出
服務(wù)端
* Serving Quart app 'quart_ws' * Debug mode: False * Please use an ASGI server (e.g. Hypercorn) directly in production * Running on http://0.0.0.0:5000 (CTRL + C to quit) [2024-06-06 18:34:20 +0800] [41216] [INFO] Running on http://0.0.0.0:5000 (CTRL + C to quit) [2024-06-06 18:34:25 +0800] [41216] [INFO] 127.0.0.1:52680 GET /ws 1.1 101 - 2000 Received from client: Hello, Server!
客戶端
Received from server: Hello, Server!
到此這篇關(guān)于Python使用Quart作為web服務(wù)器的代碼實現(xiàn)的文章就介紹到這了,更多相關(guān)Python Quart作web服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解python使用遞歸、尾遞歸、循環(huán)三種方式實現(xiàn)斐波那契數(shù)列
本篇文章主要介紹了python使用遞歸、尾遞歸、循環(huán)三種方式實現(xiàn)斐波那契數(shù)列,非常具有實用價值,需要的朋友可以參考下2018-01-01python基礎(chǔ)入門學(xué)習(xí)筆記(Python環(huán)境搭建)
這篇文章主要介紹了python基礎(chǔ)入門學(xué)習(xí)筆記,這是開啟學(xué)習(xí)python基礎(chǔ)知識的第一篇,夯實Python基礎(chǔ),才能走的更遠(yuǎn),感興趣的小伙伴們可以參考一下2016-01-01python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(二):socket建立網(wǎng)絡(luò)客戶端
看了這一節(jié),突然之間對python網(wǎng)絡(luò)編程學(xué)習(xí)筆記(1)中的一些不理解的問題有了認(rèn)識,至少明白了socket是怎么回事。這里關(guān)于socket的起源等問題就不做筆記記錄了,直接進(jìn)入主題2014-06-06使用Matplotlib 繪制精美的數(shù)學(xué)圖形例子
今天小編就為大家分享一篇使用Matplotlib 繪制精美的數(shù)學(xué)圖形例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12Python實現(xiàn)線性判別分析(LDA)的MATLAB方式
今天小編大家分享一篇Python實現(xiàn)線性判別分析(LDA)的MATLAB方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12python末尾逗號導(dǎo)致返回結(jié)果是一個元組的問題
在Python中,除非特別需要返回或傳參元組,一般不推薦在語句末尾添加逗號,應(yīng)該注意檢查是否存在末尾逗號導(dǎo)致的這些副作用,這篇文章主要介紹了python末尾逗號導(dǎo)致返回結(jié)果是一個元組,需要的朋友可以參考下2023-09-09