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

 更新时间:2024年06月07日 09:36:11   作者:顽石九变  
Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI,这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序,本文给大家介绍了Python使用Quart作为web服务器的代码实现

一、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。

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

  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服务器的代码实现的文章就介绍到这了,更多相关Python Quart作web服务器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python将string转换到float的实例方法

    Python将string转换到float的实例方法

    在本篇文章中小编给大家分享的是关于Python将string转换到float的实例方法以及相关知识点,需要的朋友们参考下。
    2019-07-07
  • python源码剖析之PyObject详解

    python源码剖析之PyObject详解

    Python实现了完全的面向对象的语言特性,所有的类均继承自object基类,对应着实现层面的PyObject.为了实现多态的特性,Python的实现过程维护了一个类型对象系统,用来记录类型信息和维护类的函数成员,本文为大家详细介绍了PyObject,需要的朋友可以参考下
    2021-05-05
  • Django配置MySQL数据库的完整步骤

    Django配置MySQL数据库的完整步骤

    这篇文章主要给大家介绍了关于Django配置MySQL数据库的完整步骤,文中通过示例代码介绍的非常详细,对大家学习或者使用django具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • TensorFlow高效读取数据的方法示例

    TensorFlow高效读取数据的方法示例

    这篇文章主要介绍了TensorFlow高效读取数据的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • Django REST framework 异常处理

    Django REST framework 异常处理

    本文将结合实例代码,介绍Django REST framework 异常处理,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Python使用turtule画五角星的方法

    Python使用turtule画五角星的方法

    这篇文章主要介绍了Python使用turtule画五角星的方法,运行该程序可以看到箭头间歇移动绘制五角星的效果,涉及Python使用turtle及time模块绘制图形的相关技巧,需要的朋友可以参考下
    2015-07-07
  • python如何查找列表中元素的位置

    python如何查找列表中元素的位置

    这篇文章主要介绍了python如何查找列表中元素的位置,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 如何运用sklearn做逻辑回归预测

    如何运用sklearn做逻辑回归预测

    这篇文章主要介绍了如何运用sklearn做逻辑回归预测问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • python做量化投资系列之比特币初始配置

    python做量化投资系列之比特币初始配置

    这篇文章主要为大家详细介绍了python做量化投资系列之比特币初始配置,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Python中类方法@classmethod和静态方法@staticmethod解析

    Python中类方法@classmethod和静态方法@staticmethod解析

    这篇文章主要介绍了Python中类方法@classmethod和静态方法@staticmethod解析,python中存在三种方法,分别为常规方法(定义中传入self)、@classmethod修饰的类方法、@staticmethod修饰的静态方法,,需要的朋友可以参考下
    2023-08-08

最新评论