从入门到实战:一招学会使用FastAPI构建高效Web应用
简介
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,与 Python 3.6+ 类型提示一起使用。它具有异步支持,并且可以与任何数据库一起使用。本文将带您从入门到实战,学会使用 FastAPI 构建高效 Web 应用。
快速入门
安装 FastAPI
首先,确保您已经安装了 Python 3.6 或更高版本。然后,使用 pip 安装 FastAPI:
pip install fastapi uvicorn
创建第一个 FastAPI 应用
创建一个新的 Python 文件,例如 app.py
,并添加以下代码:
from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"message": "Hello World"}
保存文件后,在终端中运行以下命令启动服务器:
uvicorn app:app --reload
现在,访问 http://127.0.0.1:8000/
,您将看到以下响应:
{ "message": "Hello World" }
核心概念
路由和视图
FastAPI 使用路由和视图来处理 HTTP 请求。路由定义了 URL 和 HTTP 方法,视图函数处理请求并返回响应。
以下是一个简单的路由示例:
@app.get("/items/{item_id}") async def read_item(item_id: int): return {"item_id": item_id}
在这个例子中,/items/{item_id}
是路由,read_item
是视图函数。
类型提示
FastAPI 使用 Python 3.6+ 类型提示来定义请求和响应的数据结构。这有助于编写更安全、更易于维护的代码。
以下是一个使用类型提示的路由示例:
from pydantic import BaseModel class Item(BaseModel): id: int name: str @app.post("/items/") async def create_item(item: Item): return item
在这个例子中,Item
是一个 Pydantic 模型,用于验证和序列化请求和响应数据。
异步函数
FastAPI 使用异步函数来处理请求。这意味着您可以使用 async
和 await
关键字来编写异步代码。
以下是一个异步视图函数的示例:
@app.get("/items/{item_id}") async def read_item(item_id: int): # 模拟异步数据库查询 await asyncio.sleep(1) return {"item_id": item_id}
在这个例子中,await asyncio.sleep(1)
模拟了一个异步操作。
高级功能
数据库集成
FastAPI 可以与任何数据库一起使用。以下是一个使用 SQLite 数据库的示例:
from typing import List from fastapi import FastAPI, Depends, HTTPException from sqlalchemy.orm import Session from . import models, schemas app = FastAPI() # 创建数据库模型 models.Base.metadata.create_all(bind=engine) # 获取数据库会话 def get_db(): db = SessionLocal() try: yield db finally: db.close() @app.get("/items/", response_model=List[schemas.Item]) def get_items(db: Session = Depends(get_db)): return db.query(models.Item).all() @app.post("/items/", response_model=schemas.Item) def create_item(item: schemas.Item, db: Session = Depends(get_db)): db_item = models.Item(name=item.name) db.add(db_item) db.commit() db.refresh(db_item) return db_item
在这个例子中,我们使用了 SQLAlchemy ORM 来与 SQLite 数据库交互。
安全性
FastAPI 提供了多种安全机制,例如 OAuth2、JWT 和密码哈希。
以下是一个使用 OAuth2 的示例:
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token") @app.post("/token") async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()): user = authenticate_user(fake_db, form_data.username, form_data.password) if not user: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect username or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token = create_access_token(data={"sub": user.username}) return {"access_token": access_token, "token_type": "bearer"} @app.get("/users/me") async def read_users_me(token: str = Depends(oauth2_scheme)): current_user = get_current_user(token) return current_user
在这个例子中,我们使用了 OAuth2 密码认证。
总结
FastAPI 是一个现代、快速、易于使用的 Web 框架。通过本文,您已经了解了如何从入门到实战,学会使用 FastAPI 构建高效 Web 应用。希望您能够将所学知识应用到实际项目中,并不断探索 FastAPI 的更多功能。