Fastapi简介
FastAPI简介
FastAPI是一个用于构建API的现代、快速(高性能)Web框架,基于Python 3.6+和标准Python类型提示。FastAPI的设计目标是提供一个简洁、易用、高效的工具,特别适用于快速开发、验证和扩展API。
主要特点
- 高性能:基于Starlette和Pydantic,性能可以与Node.js和Go相媲美。
- 简单易用:通过自动生成的交互式文档(Swagger UI和ReDoc),使得API开发和测试变得直观和高效。
- 类型提示:利用Python 3.6+的类型提示,确保代码的正确性和可维护性。
- 自动生成文档:根据代码自动生成API文档,无需额外工作。
- 异步支持:内置对异步编程的支持,使得处理高并发场景变得简单。
安装FastAPI
在使用FastAPI之前,需要先安装FastAPI和一个ASGI服务器(例如Uvicorn):
pip install fastapi uvicorn
快速入门示例
以下是一个简单的FastAPI示例,展示了如何创建一个基本的API并启动一个服务器。
示例:创建一个基本的API
- 创建一个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}
- 运行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。
- 定义数据模型
创建一个名为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
- 设置数据库
创建一个名为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()
- 创建数据库模型
在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)
- 创建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()
- 创建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 UI:
http://127.0.0.1:8000/docs
- ReDoc:
http://127.0.0.1:8000/redoc
这两个文档界面使得测试和验证API变得非常简单和直观。
通过这些步骤,你可以快速创建一个功能完善的API,并且利用FastAPI的高性能和易用性,极大地提高开发效率。