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ū)和豐富的擴展庫,而 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默認會加加載名為 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)用時傳遞的實際變量值替換。
當你運行上面的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處理PDF文檔的兩大功能庫(PyPDF2/pdfplumber)的使用指南
PyPDF2擅長PDF文檔操作,而pdfplumber專注于高質(zhì)量文本和表格數(shù)據(jù)提取,本文將對比Python中兩個PDF處理庫PyPDF2和pdfplumber的主要功能與適用場景,希望對大家有所幫助2026-03-03
python實現(xiàn)從字符串中找出字符1的位置以及個數(shù)的方法
這篇文章主要介紹了python實現(xiàn)從字符串中找出字符1的位置以及個數(shù)的方法,對于Python字符串操作的學(xué)習(xí)有一定的幫助與借鑒作用,需要的朋友可以參考下2014-08-08

