使用FastAPI构建高性能API

随着API的广泛使用,API的性能和响应速度变得越来越重要。FastAPI是一个基于Python 3.6+的现代Web框架,它提供了高性能和易于编写API的方式。它使用最新的Python标准类型注释和异步编程技术,使代码易于阅读和维护。

文章目录

    • 1.安装和创建FastAPI应用程序
    • 2.定义API路由和请求参数
    • 3. 处理请求和响应数据
    • 4. 使用FastAPI的依赖注入系统
    • 5. 使用异步请求处理
    • 6.部署FastAPI应用程序
      • 6.1 安装uvicorn
      • 6.2 启动FastAPI应用程序
      • 6.3 自定义配置
      • 6.4 使用systemd进行自动启动
    • 总结

1.安装和创建FastAPI应用程序

在使用FastAPI之前,需要先安装FastAPI和uvicorn。可以使用pip安装它们:

pip install fastapi uvicorn

安装完成后,可以创建一个FastAPI应用程序。创建一个名为main.py的文件,并添加以下代码:

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

这是一个最简单的FastAPI应用程序,它定义了一个根路由,当请求根路径时,返回一个JSON响应。

2.定义API路由和请求参数

FastAPI允许定义多个路由和请求参数。可以使用装饰器@app.get(),@app.post(),@app.put()和@app.delete()来定义不同的HTTP请求方法和路由。例如,以下代码定义了一个名为/items/{item_id}的路由,它使用HTTP GET方法,并且item_id是一个路径参数:

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

在这个例子中,item_id是一个路径参数,它的类型是整数。路由处理函数还接受一个名为q的查询参数,它的类型是字符串。FastAPI将自动解析和验证请求参数,并将它们作为函数参数传递给路由处理函数。

3. 处理请求和响应数据

在FastAPI中,可以轻松地定义请求和响应数据的模型,并自动进行数据验证和转换。这可以大大减少开发人员的工作量,同时确保输入和输出数据的正确性。下面是一个示例,展示如何定义请求和响应数据的模型:

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

app = FastAPI()

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

inventory = []

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

@app.get("/items/", response_model=List[Item])
async def read_items():
    return inventory

在上面的示例中,我们定义了一个Item模型,其中包括一个名称、价格和一个可选的特价标志。我们使用BaseModel类来定义模型,并使用Python类型提示来指定模型字段的类型。FastAPI将自动解析请求并将其转换为模型实例,以便在我们的应用程序中使用。

create_item函数中,我们使用@app.post装饰器来定义一个HTTP POST方法,该方法接受一个Item模型实例作为请求体,并将其添加到我们的inventory列表中。在成功添加新项后,我们返回该项以确认其已成功创建。

read_items函数中,我们使用@app.get装饰器来定义一个HTTP GET方法,该方法返回我们的inventory列表中的所有项。我们还使用response_model参数来指定响应模型为List[Item],这将告诉FastAPI将响应转换为一个Item模型实例列表。

通过这种方式,我们可以在FastAPI中轻松定义请求和响应数据模型,并让FastAPI自动处理数据验证和转换。

为了演示如何处理请求和响应数据,我们将创建一个简单的API,用于计算两个数字的和。首先,我们需要定义一个Python函数来执行此操作:

from fastapi import FastAPI

app = FastAPI()

@app.get("/add")
def add_numbers(x: int, y: int):
    return {"result": x + y}

这里我们使用了@app.get装饰器来定义一个GET请求路由,并使用类型提示来声明两个整数类型的参数xy。在函数中,我们执行了两个数字的加法运算,并返回一个字典,其中包含结果。

现在我们可以使用curl命令来测试API:

$ curl http://localhost:8000/add?x=2\&y=3
{"result": 5}

我们还可以使用FastAPI的自动文档生成功能来查看API的文档和验证请求和响应数据类型的功能。在浏览器中打开http://localhost:8000/docs,您将看到自动生成的API文档页面,其中包含有关API路由,请求参数和响应类型的详细信息。

4. 使用FastAPI的依赖注入系统

FastAPI的依赖注入系统是一种自动管理依赖项的方式,它可以方便地注入需要的依赖项并自动解决它们之间的依赖关系。这使得编写和维护应用程序更加容易和优雅。在FastAPI中,依赖项可以是任何Python可调用对象,例如函数、方法、类等。依赖项可以在函数、路径操作函数和其他依赖项中使用。

下面是一个使用依赖注入系统的示例:

from fastapi import FastAPI, Depends

app = FastAPI()

async def get_db():
    db = MyDatabase()
    try:
        yield db
    finally:
        db.close()

@app.get("/items/")
async def read_items(db: MyDatabase = Depends(get_db)):
    items = db.get_items()
    return {"items": items}

在上面的示例中,我们创建了一个名为get_db的异步函数,它返回一个MyDatabase对象。该函数被Depends装饰器包装,使得它成为一个依赖项。在read_items函数中,我们将MyDatabase对象声明为一个依赖项,并将其传递给函数作为参数。在read_items函数中,我们可以像使用其他变量一样使用db

FastAPI的依赖注入系统具有很多高级功能,例如循环依赖的处理、参数标注、请求生命周期控制等。有关更多信息,请参阅FastAPI文档。

5. 使用异步请求处理

FastAPI支持异步请求处理,这意味着它可以同时处理多个请求,而无需等待前一个请求完成。异步处理可以提高应用程序的性能和吞吐量。在FastAPI中,我们可以使用async/await语法来定义异步路径操作函数。

下面是一个使用异步请求处理的示例:

from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: int):
    return {"item_id": item_id}

在上面的示例中,我们定义了一个异步路径操作函数read_item。它接收一个item_id参数,并返回一个包含item_id的字典。在这个函数中,我们使用async/await语法来实现异步请求处理。

6.部署FastAPI应用程序

一旦我们创建了FastAPI应用程序并编写了API路由和逻辑处理代码,我们就可以将应用程序部署到生产环境中。FastAPI提供了多种部署选项,包括使用ASGI服务器、Docker容器和服务器管理工具等。

在本文中,我们将介绍如何使用uvicorn ASGI服务器来部署我们的FastAPI应用程序。

6.1 安装uvicorn

首先,我们需要安装uvicorn,这是一个ASGI服务器,可用于部署FastAPI应用程序。可以使用pip安装:

pip install uvicorn

6.2 启动FastAPI应用程序

要启动FastAPI应用程序,我们可以使用uvicorn命令并指定FastAPI应用程序的模块名和应用程序对象。例如,如果我们的应用程序存储在main.py文件中,并且应用程序对象为app,我们可以使用以下命令启动应用程序:

uvicorn main:app

这将启动uvicorn服务器并将其绑定到默认端口(即8000)上。现在,我们可以通过访问http://localhost:8000来测试我们的API。

6.3 自定义配置

我们可以使用命令行参数来自定义uvicorn的配置。例如,我们可以使用以下命令来将服务器绑定到不同的端口:

uvicorn main:app --port 8080

还可以通过使用–workers选项来指定要使用的工作进程数量:

uvicorn main:app --workers 4

在生产环境中,我们还需要使用HTTPS来保护数据传输。要使用HTTPS,我们需要为服务器提供SSL证书和密钥。可以使用以下命令指定证书和密钥文件:

uvicorn main:app --ssl-keyfile path/to/key.pem --ssl-certfile path/to/cert.pem

6.4 使用systemd进行自动启动

在生产环境中,我们可能希望使用systemd来自动启动和管理我们的FastAPI应用程序。要使用systemd,我们需要创建一个systemd服务单元文件,并将其放置在/etc/systemd/system目录中。

下面是一个示例systemd服务单元文件:

[Unit]
Description=My FastAPI Service
After=network.target

[Service]
User=myuser
Group=mygroup
WorkingDirectory=/path/to/my/app
ExecStart=/usr/local/bin/uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
Restart=always

[Install]
WantedBy=multi-user.target

在上面的示例中,我们定义了一个名为"My FastAPI Service"的服务,并指定了启动该服务所需的用户、组、工作目录和命令行参数。还定义了当服务崩溃或停止时应如何处理的Restart选项。

完成后,我们可以使用以下命令来启动服务:

systemctl start my-fastapi-service

总结

本文介绍了Python中上下文管理器与with语句的基本概念和使用方法,并以文件操作和数据库连接为例,详细说明了如何使用with语句来管理资源并确保资源的正确释放。同时,本文还介绍了如何使用FastAPI框架创建Web应用程序,并详细说明了如何定义API路由和请求参数、处理请求和响应数据、使用FastAPI的依赖注入系统、以及如何使用异步请求处理和部署FastAPI应用程序。

参考文献:

  1. Python官方文档:https://docs.python.org/3/
  2. FastAPI官方文档:https://fastapi.tiangolo.com/
  3. PEP 343 – The “with” Statement:https://www.python.org/dev/peps/pep-0343/
  4. Async IO in Python: A Complete Walkthrough:https://realpython.com/async-io-python/

你可能感兴趣的:(Python教程-基础,fastapi,python,爬虫)