一、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 设计的,因此你可以在处理请求时使用 async
和 await
关键字来执行异步操作,例如访问数据库或调用其他异步服务。这使得 quart 非常适合用于构建需要高并发处理的应用程序。
2、websocket支持
quart提供了对websocket协议的原生支持,使得实时通信和推送功能更加简单可行。这对于需要实时交互的应用,如聊天室、在线游戏等,具有极大的便利性。
3、与 flask 的比较
quart框架与广受欢迎的flask框架具有api兼容性,这意味着开发者可以轻松地将现有的flask应用迁移到quart上,并享受异步编程带来的好处。这一特性降低了学习成本,并使得开发者能够更快速地适应quart。
它们之间有一些关键的区别:
- 异步支持:quart 是基于异步 io 设计的,而 flask 是基于同步 io。这使得 quart 在处理大量并发连接时性能更好。
- asgi 与 wsgi:quart 使用 asgi 接口,而 flask 使用 wsgi 接口。asgi 提供了对 http/2、websockets 和其他协议的原生支持。
- 性能:由于 quart 的异步特性,它在处理大量并发连接时通常比 flask 更快。
- 生态: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模板引擎的简单代码示例:
首先,确保你已经安装了quart
和jinja2
。你可以使用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服务器的代码实现的文章就介绍到这了,更多相关python quart作web服务器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论