Python使用Quart作为web服务器的代码实现

简介: Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。

一、Quart 轻量级web框架介绍

Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。

1、异步支持

由于 Quart 是基于异步 IO 设计的,因此你可以在处理请求时使用 asyncawait 关键字来执行异步操作,例如访问数据库或调用其他异步服务。这使得 Quart 非常适合用于构建需要高并发处理的应用程序。

2、WebSocket支持

Quart提供了对WebSocket协议的原生支持,使得实时通信和推送功能更加简单可行。这对于需要实时交互的应用,如聊天室、在线游戏等,具有极大的便利性。

3、与 Flask 的比较

Quart框架与广受欢迎的Flask框架具有API兼容性,这意味着开发者可以轻松地将现有的Flask应用迁移到Quart上,并享受异步编程带来的好处。这一特性降低了学习成本,并使得开发者能够更快速地适应Quart。


它们之间有一些关键的区别:

  1. 异步支持:Quart 是基于异步 IO 设计的,而 Flask 是基于同步 IO。这使得 Quart 在处理大量并发连接时性能更好。
  2. ASGI 与 WSGI:Quart 使用 ASGI 接口,而 Flask 使用 WSGI 接口。ASGI 提供了对 HTTP/2、WebSockets 和其他协议的原生支持。
  3. 性能:由于 Quart 的异步特性,它在处理大量并发连接时通常比 Flask 更快。
  4. 生态:Flask 有一个庞大的社区和丰富的扩展库,而 Quart 作为较新的框架,其生态还在不断发展中。

二、使用示例

安装 quart

示例1:返回json数据

import logging
from quart import Quart, render_template, request, jsonify

app = Quart(__name__)
app.logger.setLevel(logging.INFO) # 设置 Quart 日志记录器的级别为 INFO

# 返回 html 模板
@app.route('/')
async def index():
                app.logger.info('Quart index load success ')
        return 'Hello, Quart!'

# GET请求,返回json数据
@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数据
                # 假设我们只是将接收到的数据返回给客户端
                return jsonify(data), 201 # 返回状态码201表示成功创建了资源

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

示例2:返回html模板

以下是一个使用Quart和Jinja2模板引擎的简单代码示例:


首先,确保你已经安装了quartjinja2。你可以使用pip来安装它们(如果尚未安装):

pip install quart jinja2

然后,创建一个简单的Quart应用,该应用使用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)

在这个例子中,我们创建了一个Quart应用,Quart默认会加加载名为 templates 的文件夹中的模板。


接下来,我们定义了一个路由处理函数index,它使用render_template函数来渲染名为index.html的模板。我们还传递了两个变量name和framework给模板,这些变量将在模板中被替换。


你需要在项目的根目录下创建一个名为templates的文件夹,并在其中创建一个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函数调用时传递的实际变量值替换。


当你运行上面的Quart应用并访问http://localhost:5000/时,你应该会看到一个欢迎页面,其中包含了通过Jinja2模板引擎动态插入的name和framework变量的值。

示例3:websocket使用

1)创建websocket服务

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
            # 处理接收到的数据,这里我们只是简单地将数据回显给客户端
        await websocket.send(data)
 
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

2)使用Python websocket创建client端,发送和接收websocket消息

首先,确保你已经安装了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:  
        # 发送一条消息到服务器  
        await websocket.send("Hello, Server!")  
          
        # 接收服务器的响应  
        response = await websocket.recv()  
        print(f"Received from server: {response}")  
  
        # 可以继续发送和接收更多的消息  
        # ...  
  
# 运行客户端  
asyncio.run(websocket_client())

上面代码,首先导入了asyncio和websockets库。然后,定义了一个异步函数websocket_client,使用websockets.connect函数连接到WebSocket服务器。连接建立后,通过websocket.send方法发送一条消息给服务器,并通过websocket.recv方法等待并接收服务器的响应。最后,使用asyncio.run函数来运行这个异步客户端。


3)运行代码,得到如下输出

服务端

* 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!

到此这篇关于Python使用Quart作为web服务器的代码实现的文章就介绍到这了。

相关文章
|
16小时前
|
存储 算法 索引
深度挖掘:Python并查集背后的秘密,让你的代码逻辑清晰如水晶!
【7月更文挑战第17天】并查集,一种高效处理集合合并与查询的数据结构,常用于图论、社交网络分析等。Python中的实现利用数组存储元素的父节点,通过路径压缩和按秩合并优化查找和合并操作。简单代码示例展示了查找和合并方法,以及应用在检测无向图环路。并查集以其优雅的解决方案在算法世界中闪耀,提升代码的清晰度和效率。
13 5
|
17小时前
|
JavaScript 前端开发 网络协议
从理论到实践:全面剖析Python Web应用中的WebSocket实时通信机制
【7月更文挑战第17天】WebSocket在实时Web应用中扮演重要角色,提供全双工通信,减少延迟。本文详述了Python中使用`websockets`库创建服务器的步骤,展示了一个简单的echo服务器示例,监听8765端口,接收并回显客户端消息。客户端通过JavaScript与服务器交互,实现双向通信。了解WebSocket的握手、传输和关闭阶段,有助于开发者有效利用WebSocket提升应用性能。随着实时需求增长,掌握WebSocket技术至关重要。
12 6
|
1天前
|
算法 计算机视觉 开发者
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
【7月更文挑战第16天】并查集,Python中的效率明星,处理不相交集合合并与查询。用于社交网络分析、图像处理、图论算法等领域。优雅实现结合路径压缩和按秩合并
7 1
|
1天前
|
前端开发 JavaScript UED
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
【7月更文挑战第16天】在前后端分离的Web开发中,WebSocket解决了实时数据交换的问题。使用Python的Flask和Flask-SocketIO库,后端创建WebSocket服务,监听并广播消息。前端HTML通过JavaScript连接到服务器,发送并显示接收到的消息。WebSocket适用于实时通知、在线游戏等场景,提升应用的实时性和用户体验。通过实战案例,展示了如何实现这一功能。
|
1天前
|
JavaScript 前端开发 UED
WebSocket在Python Web开发中的革新应用:解锁实时通信的新可能
【7月更文挑战第16天】WebSocket是实现Web实时通信的协议,与HTTP不同,它提供持久双向连接,允许服务器主动推送数据。Python有多种库如websockets和Flask-SocketIO支持WebSocket开发。使用Flask-SocketIO的简单示例包括定义路由、监听消息事件,并在HTML中用JavaScript建立连接。WebSocket提高了实时性、减少了服务器压力,广泛应用于聊天、游戏等场景。
10 1
|
1天前
|
运维 负载均衡 前端开发
深度解析:Python Web前后端分离架构中WebSocket的选型与实现策略
【7月更文挑战第16天】Python Web开发中,前后端分离常见于实时通信场景,WebSocket作为全双工协议,常用于此类应用。选型时考虑性能、功能、易用性、社区支持和成本。Flask-SocketIO是实现WebSocket的一个选项,它简化了与Flask的集成。案例展示了如何用Flask-SocketIO创建一个实时聊天室:后端处理消息广播,前端通过Socket.IO库连接并显示消息。此实现策略演示了在Python中实现实时通信的基本步骤。
9 0
|
1天前
|
移动开发 前端开发 网络协议
Python Web实时通信新纪元:基于WebSocket的前后端分离技术探索
【7月更文挑战第16天】WebSocket增强Web实时性,Python借助Flask-SocketIO简化实现。安装`flask`和`flask-socketio`,示例展示服务器端接收连接及消息并广播响应,前端HTML用Socket.IO库连接并监听事件。WebSocket开启双向通信新时代,助力动态Web应用开发。
|
1天前
|
算法 测试技术 Python
python中代码逻辑错误
【7月更文挑战第15天】
12 2
|
2天前
|
算法 安全 编译器
PHP 8的新特性及其对现代Web开发的影响
在数字时代的浪潮中,PHP作为一门历史悠久的服务器端脚本语言,一直在不断地进化以适应新的编程挑战。本文将深入探讨PHP 8的最新特性,包括JIT编译器、联合类型、命名参数、匹配表达式等,并分析这些新特性如何优化代码、提升性能和增强安全性。通过实际案例,我们还将展示PHP 8如何影响现代Web开发的实践,以及开发者如何利用这些新工具来构建更快、更可靠、更易于维护的应用。
|
3天前
|
XML 前端开发 API
颠覆传统!AJAX、Fetch API与Python后端,开启Web开发新篇章!
【7月更文挑战第14天】Web开发中,AJAX作为异步通信先驱,与新兴的Fetch API一起革新交互体验。Fetch基于Promise,简化了请求处理。Python后端,如Flask,提供稳定支撑。这三者的融合,推动Web应用达到新高度,实现高效、实时交互。通过示例展示,我们看到从发送请求到更新UI的流畅过程,以及Python如何轻松返回JSON数据。这种组合揭示了现代Web开发的潜力和魅力。
9 0