
云原生 API 网关 APISIX 入门教程
想快速创建一个高效又安全的Web API?那FastAPI绝对是你的不二之选。这个框架不仅超级快,而且它自带了自动生成文档的功能,让你省去了很多麻烦。更重要的是,它对异步编程的支持非常好,能帮你在高并发场景下节省资源。接下来,就让我们看看怎么用FastAPI来打造一个简单的API。
要开始玩转FastAPI,你得先把它装到你的电脑里。打开命令行工具,输入下面这行代码就可以安装FastAPI和Uvicorn。Uvicorn是用来运行FastAPI应用的服务器。
pip install fastapi uvicorn
安装完成后,你就准备好开始编码啦!
咱们从最基础的开始,创建一个返回“Hello, World!”的API端点。新建一个Python文件,比如叫main.py
,然后把下面这段代码粘进去。
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"message": "Hello, World!"}
这段代码做了啥呢?首先我们导入了FastAPI
类,接着创建了一个app
实例。然后通过装饰器@app.get("/")
定义了一个GET请求的路由,当访问根路径时就会调用read_root
函数,返回一个字典,里面包含了我们的问候语。
要启动这个API,回到命令行,运行uvicorn main:app --reload
。--reload
参数可以让Uvicorn在代码变化时自动重启服务器,方便调试。
FastAPI天生支持异步编程,这可是个大杀器。异步函数可以同时处理多个任务,不会因为等待某个操作完成而阻塞整个程序。修改刚才的read_root
函数,加上async
关键字试试看。
@app.get("/")
async def read_root():
return {"message": "Hello, async world!"}'
现在这个函数变成了异步的,虽然看起来没多大区别,但在处理I/O密集型任务(比如数据库查询、网络请求)时,它的性能提升可就不是一点两点了。
有时候你想让API更灵活一些,比如根据不同的用户ID返回特定的信息。这时候就可以用到路径参数了。看看下面的例子:
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
这里{item_id}
就是路径参数,它会自动转换成整数类型。这样你就可以通过/items/1
这样的URL来获取特定项的信息了。
温馨提示:记得检查路径参数的数据类型哦,要是传入了不符合要求的值,FastAPI会帮你自动返回422错误,不过最好还是自己提前做好验证。
除了路径参数,你还可能需要根据用户的额外需求来调整返回的内容。查询参数就能派上用场了。来看个例子:
from typing import Union
@app.get("/items/")
async def read_item(q: Union[str, None] = None):
if q:
return {"q": q}
return {"message": "No query parameter"}
q
就是一个查询参数,如果用户在请求中提供了?q=something
,那么q
就会有值;如果没有提供,q
就会是None
。为了不让代码出错,我们给q
设了个默认值None
,并使用了typing.Union
来告诉FastAPI这个参数可能是字符串也可能是None
。
当你要接收用户提交的数据时,就需要用到请求体了。FastAPI结合Pydantic库,可以轻松地定义数据模型,并自动进行数据校验。举个栗子:
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: Union[str, None] = None
price: float
tax: Union[float, None] = None
@app.post("/items/")
async def create_item(item: Item):
return item
Item
类定义了请求体的结构,每个字段都指定了类型,还可以设置默认值。当你POST一个JSON对象到/items/
时,FastAPI会自动解析并验证数据,只有符合模型定义的数据才会被接受。
说到这儿,不得不提一下FastAPI最酷炫的功能之一——自动化交互文档。只要你按照规范定义了API,FastAPI就会自动生成Swagger UI或ReDoc界面。这些界面上不仅可以查看API文档,还能直接测试API功能,简直不要太方便。
访问http://127.0.0.1:8000/docs
或者http://127.0.0.1:8000/redoc
就能看到它们了。是不是超省心?
构建API的时候,安全性绝对不能忽视。FastAPI提供了多种方式来保护你的API,比如OAuth2认证、依赖注入等。你可以根据实际需求选择合适的安全措施。比如说,想要限制某些敏感接口只能由授权用户访问,就可以用Depends
来添加认证逻辑。
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
async def get_current_user(token: str = Depends(oauth2_scheme)):
# 这儿写你的认证逻辑
fake_user_db = {"johndoe": "secret"}
user = fake_user_db.get(token)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid authentication credentials",
headers={"WWW-Authenticate": "Bearer"},
)
return user
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"user": current_user}
这段代码展示了如何用OAuth2PasswordBearer
来获取用户提供的Token,并通过Depends
将其传递给认证函数。如果认证失败,就会抛出异常,阻止未授权的访问。
以下是使用FastAPI时的一些最佳实践方式,确保你在构建应用时能够遵循fastapi 最佳实践:
今天咱聊了这么多关于FastAPI的东西,从安装到创建API,再到异步函数、路径参数、查询参数、请求体、自动化文档和安全性。你会发现,用FastAPI构建API真的挺简单,而且效率极高。希望这些内容能帮助你更好地理解和使用FastAPI,快去动手试试吧!
文章转自微信公众号@彩虹的生财日常