Fastapi简介

FastAPI简介

FastAPI是一个用于构建API的现代、快速(高性能)Web框架,基于Python 3.6+和标准Python类型提示。FastAPI的设计目标是提供一个简洁、易用、高效的工具,特别适用于快速开发、验证和扩展API。

主要特点

  1. 高性能:基于Starlette和Pydantic,性能可以与Node.js和Go相媲美。
  2. 简单易用:通过自动生成的交互式文档(Swagger UI和ReDoc),使得API开发和测试变得直观和高效。
  3. 类型提示:利用Python 3.6+的类型提示,确保代码的正确性和可维护性。
  4. 自动生成文档:根据代码自动生成API文档,无需额外工作。
  5. 异步支持:内置对异步编程的支持,使得处理高并发场景变得简单。

安装FastAPI

在使用FastAPI之前,需要先安装FastAPI和一个ASGI服务器(例如Uvicorn):

pip install fastapi uvicorn

快速入门示例

以下是一个简单的FastAPI示例,展示了如何创建一个基本的API并启动一个服务器。

示例:创建一个基本的API

  1. 创建一个FastAPI应用

创建一个名为main.py的文件,并添加以下内容:

from fastapi import FastAPI

app = FastAPI()

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

@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
  1. 运行FastAPI应用

使用Uvicorn启动服务器:

uvicorn main:app --reload

访问http://127.0.0.1:8000,你将看到返回的{"message": "Hello, World!"}

访问http://127.0.0.1:8000/items/42?q=example,你将看到返回的{"item_id": 42, "q": "example"}

详细示例:创建一个完整的CRUD应用

以下是一个更复杂的示例,展示了如何使用FastAPI创建一个CRUD(创建、读取、更新、删除)API。

  1. 定义数据模型

创建一个名为models.py的文件,定义一个Pydantic模型和一个数据库模型(使用SQLAlchemy):

from typing import Optional

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: Optional[str] = None
    price: float
    tax: Optional[float] = None
  1. 设置数据库

创建一个名为database.py的文件,设置SQLAlchemy数据库连接:

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()
  1. 创建数据库模型

models.py文件中,添加SQLAlchemy模型:

from sqlalchemy import Column, Integer, String, Float

from .database import Base

class ItemModel(Base):
    __tablename__ = "items"

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    description = Column(String, index=True)
    price = Column(Float, index=True)
    tax = Column(Float, index=True)
  1. 创建CRUD操作

创建一个名为crud.py的文件,定义CRUD操作:

from sqlalchemy.orm import Session

from . import models, schemas

def get_item(db: Session, item_id: int):
    return db.query(models.ItemModel).filter(models.ItemModel.id == item_id).first()

def create_item(db: Session, item: schemas.Item):
    db_item = models.ItemModel(name=item.name, description=item.description, price=item.price, tax=item.tax)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

def get_items(db: Session, skip: int = 0, limit: int = 10):
    return db.query(models.ItemModel).offset(skip).limit(limit).all()
  1. 创建API路由

main.py中,添加API路由:

from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session

from . import crud, models, schemas
from .database import SessionLocal, engine

models.Base.metadata.create_all(bind=engine)

app = FastAPI()

# Dependency
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/items/", response_model=schemas.Item)
def create_item(item: schemas.Item, db: Session = Depends(get_db)):
    return crud.create_item(db=db, item=item)

@app.get("/items/", response_model=list[schemas.Item])
def read_items(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    items = crud.get_items(db, skip=skip, limit=limit)
    return items

@app.get("/items/{item_id}", response_model=schemas.Item)
def read_item(item_id: int, db: Session = Depends(get_db)):
    db_item = crud.get_item(db, item_id=item_id)
    if db_item is None:
        raise HTTPException(status_code=404, detail="Item not found")
    return db_item

运行应用

通过以下命令运行FastAPI应用:

uvicorn main:app --reload

访问http://127.0.0.1:8000/items/可以查看所有项,http://127.0.0.1:8000/items/{item_id}可以查看特定项,http://127.0.0.1:8000/items/(POST请求)可以创建新项。

自动生成的文档

FastAPI自动生成交互式文档,你可以通过访问以下URL查看:

  • Swagger UIhttp://127.0.0.1:8000/docs
  • ReDochttp://127.0.0.1:8000/redoc

这两个文档界面使得测试和验证API变得非常简单和直观。

通过这些步骤,你可以快速创建一个功能完善的API,并且利用FastAPI的高性能和易用性,极大地提高开发效率。

Written on June 25, 2024