您的位置:

快速搭建RESTful API——FastAPI框架

在Web开发领域,Python一直是深受开发者喜爱的语言。其中,很多人使用Python来搭建RESTful API,而FastAPI框架作为Python中的一枚新星,它有着很多优秀的特性,比如高性能、易于开发、易于测试等等。本文将从多个方面对FastAPI框架做详细的阐述,包括FastAPI框架的介绍、安装、基本使用、模型和数据库、WebSocket等等。

一、介绍

FastAPI是一个基于Python 3.6+的快速Web框架,它具有以下特点:

  1. 快速:使用FastAPI可以快速构建高性能的RESTful API。
  2. 易于开发:具有易于使用和易于编写的API设计,同时FastAPI还提供了很多代码生成的特性以方便开发。
  3. 快速学习:FastAPI框架有着清晰的文档和例子,使任何人都可以简单快速地学习和开始使用它。
  4. 标准化:FastAPI遵循市场上最好的实践,并充分利用现代Python3中的特性(如类型提示等)。

二、安装

在安装FastAPI之前,需要首先安装Python和pip工具。

1、在终端中输入以下内容进行安装:

pip install fastapi

2、安装完FastAPI后,可以输入以下内容来安装uvicorn(这是一个基于asgi的高性能Web服务器):

pip install uvicorn

三、基本使用

在安装完成之后,就可以利用FastAPI框架开始构建你的API了。下面是一个很基础的FastAPI示例:

from fastapi import FastAPI

app = FastAPI()

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

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

上述代码中,我们先导入了FastAPI框架,然后创建了一个新的FastAPI实例(app)。不同于其他框架,在FastAPI中,每个路由操作都只是简单的Python函数。使用装饰器(如@app.get)来告诉FastAPI框架我们对API的请求方式(GET, POST等等)以及对应的URL路径(如/items/{item_id})。

对于我们的read_item函数,我们指定了两个参数:item_id和q,它们都是必填项和可选项。在FastAPI的API请求中,使用类型提示可以验证请求中的数据类型是否正确,并且可以根据默认值自动推断参数是否为必填项。

四、模型和数据库

在实际使用时,你需要保存很多不同的数据。在FastAPI框架中,我们可以使用pydantic模型来验证数据。下面是一个例子:

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

app = FastAPI()

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

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

上述代码中,我们先导入相关的依赖,然后定义了一个Item模型类(是一个继承自BaseModel的Python类)。在Item类中,定义了三个属性:name(str类型)、price(float类型)和is_offer(bool类型)。其中,is_offer属性是可选的,默认为None。

我们接着定义了一个create_item函数,其中有一个参数item(即Item类型)。对于通过FastAPI框架使用的API请求,如果请求的数据不符合Item的定义,FastAPI框架将会向客户端返回400错误。在代码中,我们返回了刚刚收到的item值。

在实际使用中,我们需要将数据存储到数据库中。在FastAPI框架中,我们可以利用SQLAlchemy或ORM(对象关系映射)框架,以更加高效和安全的方式来管理数据和数据库。下面是一个例子:

from fastapi import FastAPI
from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Integer, String, Column

app = FastAPI()

SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

class Item(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String, index=True)
    description = Column(String, index=True)
    status = Column(String, index=True)

@app.post("/items/")
async def create_item(item: Item):
    db_item = Item(title=item.title, description=item.description, status=item.status)
    db = SessionLocal()
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

上述代码中,我们引入了SQLAlchemy工具,定义了一个Item表并且创建了一个create_item函数。在这个函数中,我们创建了一个数据库环境,将Item插入到数据库中(在这里是postgreSQL)并返回这个item。在实际项目中,你可以根据自己需要的数据库类型来改变这里的数据库连接方法。

五、WebSocket

FastAPI框架同样支持服务器端和客户端WebSocket。下面是一个例子:

服务器端:

from fastapi import FastAPI, WebSocket

app = FastAPI()

class ConnectionManager:
    def __init__(self):
        self.active_connections = []

    async def connect(self, websocket: WebSocket):
        await websocket.accept()
        self.active_connections.append(websocket)

    def disconnect(self, websocket: WebSocket):
        self.active_connections.remove(websocket)

    async def broadcast(self, data: str):
        for connection in self.active_connections:
            await connection.send_text(data)

manager = ConnectionManager()

@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
    await manager.connect(websocket)
    try:
        while True:
            data = await websocket.receive_text()
            await manager.broadcast(f"Client says: {data}")
    except WebSocketDisconnect:
        manager.disconnect(websocket)
        await manager.broadcast(f"Client left!")

客户端:

from fastapi import FastAPI
import websocket

app = FastAPI()

@app.get("/ws/")
async def websocket():
    ws = websocket.create_connection("ws://localhost:8000/ws/")
    ws.send("Hello, Server")
    result = ws.recv()
    return {"Result: ": result}

上述代码中,我们定义了一个WebSocket服务器端和客户端,其中WebSocket连接管理器类ConnectionManager维护了所有活动连接的列表。在服务器端代码中,我们定义了一个WebSocket连接点,客户端代码中我们定义了一个客户端API,使用websocket库向服务器端建立WebSocket连接并发送消息。

六、结语

通过本文对FastAPI框架的深入讲解,相信大家已经对FastAPI的基本使用和更多高级特性有了更深层次的了解。FastAPI凭借其高性能、易于开发的优点,很快成为了Python Web开发的热门选择之一。希望本文可以帮助您更好地了解和使用它。