关注公众号《DevOps运维民工》,将获取更多运维干货
目录
简介
Starlette
安装
第一个接口
项目文件结构
请求体
更多文章请扫一扫
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。
特性:
依赖
Starlette 是一个轻量级的 ASGI 框架/工具包。它是构建高性能异步服务的理想选择,并且支持 HTTP 和 WebSockets。
您可以使用Uvicorn,Daphne 或 Hypercorn 运行ASGI 框架,这边选用Uvicorn,它是一个快速的 ASGI 服务器,基于 uvloop 和 httptools 构建的.
Pydantic
Pydantic 是一个用来执行数据校验的 Python 库,可以在代码运行时提供类型提示,数据校验失败时提供友好的错误提示。FastAPI是建立在Pydantic 基础之上。
安装fastapi
pip install fastapi
安装uvicorn作为服务器
pip install uvicorn[standard]
也可以安装所有的可选依赖及对应功能
pip install fastapi[all]
运行
uvicorn main:app --reload --port 8888
uvicorn main:app 命令含义如下:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello FastAPI"}
说明:
打开浏览器访问 http://127.0.0.1:8888
{"message":"Hello FastAPI"}
打开交互式API文档
http://127.0.0.1:8888/docs
将会看到自动生成的交互式 API 文档(由 Swagger UI 提供)
总之只需要下面5步, 即可完成一个接口,是不是很简单.
如果你正在开发一个应用程序或 Web API,很少会将所有的内容都放在一个文件中,这样显得代码很没逻辑性,也不利于程序后期的维护和扩展。
.
├── app # 「app」是一个 Python 包
│ ├── __init__.py # 这个文件使「app」成为一个 Python 包
│ ├── main.py # 「main」模块,例如 import app.main,项目入口
│ ├── dependencies.py # 「dependencies」模块,例如 import app.dependencies
│ └── routers # 「routers」是一个「Python 子包」
│ │ ├── __init__.py # 使「routers」成为一个「Python 子包」
│ │ ├── items.py # 「items」子模块,例如 import app.routers.items
│ │ └── users.py # 「users」子模块,例如 import app.routers.users
│ └── internal # 「internal」是一个「Python 子包」
│ ├── __init__.py # 使「internal」成为一个「Python 子包」
│ └── admin.py # 「admin」子模块,例如 import app.internal.admin
说明:
上面有几个 __init__.py
文件:每个目录或子目录中都有一个,能将代码从一个文件导入到另一个文件.
APIRouter
在FastAPI中,使用APIRouter 处理这种多程序分类,。假设专门用于处理用户的文件是的子模块/app/routers/users.py, 希望将与用户相关的路径操作与其余代码分开,使其看起来简洁明了。
这时候可以使用 APIRouter 为该模块创建路径操作。
比如专门用于处理用户的文件是的子模块/app/routers/users.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/users/")
async def read_users():
return [{"username": "zhangsan"}, {"username": "lisi"}]
@router.get("/users/me")
async def read_user_me():
return {"username": "wangwu"}
@router.get("/users/{username}")
async def read_user(username: str):
return {"username": username}
router应用中的另一个子模块。
同样的,通过 APIRouter 来对其路由进行注册,代码如下:/app/routers/items.py
from fastapi import APIRouter, Depends, HTTPException
router = APIRouter()
fake_items_db = [
{"username": "zhangsan"},
{"username": "lisi"},
{"username": "wangwu"}
]
@router.get("/")
async def read_items():
return fake_items_db
@router.get("/{item_id}")
async def read_item(item_id: str):
if item_id not in fake_items_db:
raise HTTPException(status_code=404, detail="Item not found")
return {"name": fake_items_db[item_id]["name"], "item_id": item_id}
这样就将两个功能模块 item, user
给分离开来了
说明:
写完模块后,还有最后一步,将item和user的APIRouter 注册到核心对象上去。
这时候就需要用到include_router,
打开根目录main.py
from routers import users,items
from fastapi import FastAPI
import uvicorn
app = FastAPI()
app.include_router(users.router,prefix='/users',tags=["users模块"])
app.include_router(items.router,prefix='/items',tags=["items模块"])
if __name__ == '__main__':
uvicorn.run('main:app',host='0.0.0.0',port=8888,reload=True,debug=True,workers=1)
说明:
打开http://127.0.0.1:8888/docs交互式文档,可以看两个应用下的接口.
当你需要将数据从客户端(例如浏览器)发送给 API 时,你将其作为「请求体」发送。
请求体是客户端发送给 API 的数据。响应体是 API 发送给客户端的数据。
你的 API 几乎总是要发送响应体。但是客户端并不总是需要发送请求体。
我们使用 Pydantic 模型来声明请求体,并能够获得它们所具有的所有能力和优点。
从 pydantic 中导入 BaseModel
class Item(BaseModel):
name: str
description: Optional[str] = None
price: float
@router.post("/info")
def create_item(item:Item):
return item
提示:
你不能使用 GET 操作(HTTP 方法)发送请求体。
扫描下面二维码关注公众号,获取更多学习资源