python异步的ASGI与Fast Api实现

yizhihongxing

下面是关于“python异步的ASGI与Fast Api实现”的完整攻略,包括两条示例说明:

概述

在Python中,异步编程是一种非常流行的编程范式,以其高效性和低资源消耗而闻名。ASGI(异步服务器网关接口)是Python Web应用程序中使用的异步协议。FastAPI是一个基于ASGI的现代,快速(Fast)框架,可以让你使用Python 3.7+中最新的异步技术,设计和开发高性能的Web应用程序。在本文中,我们将介绍如何使用Python中的异步和ASGI来构建FastAPI应用程序,并提供两个示例以解释如何使用FastAPI实现异步编程。

步骤

以下是使用Python的FastAPI进行异步编程的步骤:

步骤1:安装FastAPI

在终端中输入以下命令安装FastAPI和uvicorn:

pip install fastapi uvicorn

步骤2:异步应用程序

为了让我们的应用程序支持异步,我们需要使用ASGI(异步服务器网关接口)。ASGI是一个Web服务器与Web应用程序之间的接口,该接口使Web应用程序更容易编写,更易于扩展,并且更加高效。以下是一个示例FastAPI应用程序:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

在上面的示例中,我们定义了一个FastAPI应用程序,然后使用一个异步函数装饰器@app.get('/')来定义一个GET路由处理器函数。在该路由处理器函数中,我们使用了异步关键字async以及await语句来等待异步调用的响应。

步骤3:运行FastAPI应用程序

以下步骤将启动FastAPI应用程序:

import uvicorn
if __name__ == "__main__":
    uvicorn.run(app, debug=True)

在上述示例中,我们按常规Python应用程序的方式定义了一个启动点,以便在“python main.py”中启动该应用程序。我们使用“uvicorn.run”函数启动FastAPI应用程序,并设置debug=True来开启调试模式。

步骤4:实现异步

以下是一个示例将异步运行和响应数据集成入FastAPI应用程序的方式。假设我们需要使用异步运行来获取一个URL的数据:

from fastapi import FastAPI, HTTPException
import aiohttp

app = FastAPI()

async def get_data_from_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            if response.status != 200:
                raise HTTPException(status_code=response.status, detail=response.text)
            return await response.json()

@app.get("/")
async def root():
    data = await get_data_from_url("https://jsonplaceholder.typicode.com/todos/1")
    return data

在上面的示例中,我们在应用程序中定义了一个异步函数get_data_from_url,它使用aiohttp来异步运行URL并返回结果。我们还使用了HTTPException来处理任何错误状态码。

在应用程序的路由处理器函数中,我们异步等待get_data_from_url函数的响应,然后将异步响应返回给客户端。

步骤5:运行FastAPI应用程序

同步应用程序与异步应用程序的主要区别是处理请求的方式。使用异步运行时,必须按照异步方式处理数据和响应。使用FastAPI时,可以使用uvicorn服务器运行异步应用程序。因此,按照以下步骤运行FastAPI应用程序:

import uvicorn

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

在上述示例中,我们按常规Python应用程序的方式定义了一个启动点,以便在“python main.py”中启动该应用程序。我们使用“uvicorn.run”函数启动FastAPI应用程序,并设置host="0.0.0.0"port=8000来指定应用程序的地址和端口。调试模式也可以设置为True。

示例1

在这个示例中,我们将实现一个异步的服务器端点,可以接收请求和响应,服务器的代码如下:

from fastapi import FastAPI
from typing import List
from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    is_offer: bool = None

app = FastAPI()

@app.post("/items/")
async def create_item(item: Item):
    return item

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

@app.get("/items/")
async def read_items(skip: int = 0, limit: int = 10):
    return {"skip": skip, "limit": limit}

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

在上线文中,我们实现了四个不同的路由处理器函数,用于处理POST,GET,PUT请求并返回异步响应。我们使用Pydantic库定义了数据模型,用于存储与请求一起发送的数据。这样我们就可以使用item参数接收POST请求,并使用其参数来处理内容。使用GET请求和参数时,我们使用了路由上指定的参数来存储数据。在PUT请求中,我们使用“/items/{item_id}”路由来接收数据和更新相应的记录。

我们使用async关键字和await语句等待异步调用的响应。在启动应用程序时,使用以下命令启动:

$ uvicorn main:app --reload

在上述示例中,使用--reload参数启动Uvicorn应用程序时,可以在更改应用程序文件时重载文件。

示例2

在这个示例中,我们将创建一个异步的计算机视觉应用程序。计算机视觉应用程序可以处理图像并识别物体。在本例中,我们将使用DenseNet来识别图像中的对象。实现异步计算机视觉应用程序的代码如下:

import io
import numpy as np
import torch
from PIL import Image
from fastapi import FastAPI, UploadFile, File

app = FastAPI()


async def get_model():
    model = torch.hub.load('pytorch/vision:v0.6.0', 'densenet121', pretrained=True)
    model.eval()
    return model


async def run_inference(model, input_image):
    with torch.no_grad():
        output = model(input_image)
    return output.squeeze().numpy()


@app.post("/predict/")
async def predict(file: UploadFile = File(...)):
    contents = await file.read()
    input_image = Image.open(io.BytesIO(contents)).convert('RGB')
    input_tensor = torch.unsqueeze(torch.from_numpy(np.asarray(input_image)), dim=0).float() / 255.
    model = await get_model()
    output = await run_inference(model, input_tensor)
    return {"prediction": output.tolist()}

在上面的示例中,我们使用DenseNet预先训练的模型来识别图像中的对象。我们使用PyTorch来预处理图像和异步运行预测模型。我们还添加了一个异步路由处理器函数,用于上传图像并调用预测模型。

在“/predict/”路径中,我们使用UploadFile类来上传图像。我们使用io.BytesIO流来从字节内容中读取数据,并使用Pillow库从字节流中读取图像数据。我们使用异步方式加载模型,以便不会阻塞应用程序的执行。使用异步方式运行模型并获取其输出,然后使用响应结果返回预测结果。最后,使用output.tolist()将输出转换为列表格式,以便在返回响应时序列化为JSON格式。

总结

在本文中,我们介绍了如何使用Python的ASGI和FastAPI来实现异步编程。我们提供了两个示例,用于说明如何使用FastAPI实现异步编程,以及如何使用异步模型和计算机视觉应用程序。使用Python进行异步编程的许多优点使其成为处理高并发和低延迟请求的理想选择。FastAPI是一个众所周知的Web框架,它可以使我们轻松地构建异步Web应用程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python异步的ASGI与Fast Api实现 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月15日

相关文章

  • Flask框架响应、调度方法和蓝图操作实例分析

    Flask是一款基于Werkzeug和Jinja2的轻量级Web框架,具有优雅简洁的代码风格、灵活性和可扩展性。在Flask框架中,响应、调度方法和蓝图操作是非常关键的内容,下面我们将对这三个方面进行详细讲解,并分别给出两个实例进行说明。 Flask框架响应 在Flask框架中,响应是指服务器返回给客户端的数据,Flask框架内置了多种响应类型,如HTML页…

    Flask 2023年5月15日
    00
  • Vue打包路径配置过程

    下面是 Vue 打包路径配置的完整攻略: 1. 理解打包路径 在 Vue 应用中,所有的资源文件都可以被打包(Bundle)到一起,如 JS、CSS、图片等等。在浏览器端使用时,需要访问打包后的文件,这些文件在浏览器中被认为是相对于 HTML 引用的路径来解析的。因此,我们需要对打包路径进行配置。打包路径分为两种情况: 在开发环境下使用的路径 在生产环境下使…

    Flask 2023年5月16日
    00
  • flask-script模块的具体使用

    Flask-Script是一个与Flask集成的命令行解析器,使得开发者可以轻松地通过命令行来对Flask应用程序进行管理。 安装Flask-Script 在使用Flask-Script之前,需要将其安装到Flask应用程序中。在终端中输入以下命令来安装Flask-Script: pip install flask-script 使用Flask-Script…

    Flask 2023年5月16日
    00
  • 详解python开发环境搭建

    详解Python开发环境搭建 在开始Python开发之前,需要先搭建好Python的开发环境。本文将详细讲解Python开发环境的搭建过程。 安装Python 首先,需要安装Python。可以去Python官网下载安装包,选择对应的版本(Python2或Python3),然后按照安装向导完成安装。 安装代码编辑器 安装完Python之后,需要安装一个代码编辑…

    Flask 2023年5月16日
    00
  • python flask几分钟实现web服务的例子

    下面是关于“python flask几分钟实现web服务的例子”的完整攻略,包含两个示例: 示例 1:Hello World 1. 安装 Flask 在命令行中输入以下命令安装Flask: pip install flask 2. 创建 Python 文件 在任何目录中创建一个名为app.py的 Python 文件,然后复制以下代码: from flask …

    Flask 2023年5月15日
    00
  • python flask开发的简单基金查询工具

    下面是详细讲解“python flask开发的简单基金查询工具”的完整攻略。 介绍 Python Flask是一个轻量级的Web框架,它可以帮助我们快速地搭建Web应用程序。在这篇攻略中,我们将使用Python Flask框架来构建一个简单的基金查询工具。 环境要求 在开始之前,我们需要准备好以下环境: Python 3.x Flask requests b…

    Flask 2023年5月15日
    00
  • Python的flask接收前台的ajax的post数据和get数据的方法

    关于“Python的Flask接收前台的ajax的POST数据和GET数据的方法”的攻略,可以分为两部分来讲解。下面将详细介绍这两部分内容。 一、Flask接收前台的ajax的POST数据的方法 一般情况下,前台向后台提交数据的方式有POST和GET两种。在Flask中,接收前台的ajax的POST数据的方法,可以通过request对象进行获取。 下面是一个…

    Flask 2023年5月16日
    00
  • 详解Python Flask框架的安装及应用

    下面是详解Python Flask框架的安装及应用攻略。 安装Flask框架 首先,我们需要安装Flask框架。你可以使用pip命令进行安装。在你的命令行终端中输入以下命令: pip install flask 这个命令会自动下载并安装Flask框架。如果出现类似”Successfully installed Flask-1.1.1 Jinja2-2.10.…

    Flask 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部