0
点赞
收藏
分享

微信扫一扫

轻松入门FastAPI框架开发Restful API

yellowone 2022-02-09 阅读 195

简介  

FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。


特性:


  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。

  • 高效编码:提高功能开发速度约 200% 至 300%。*

  • 更少 bug:减少约 40% 的人为(开发者)导致错误。*

  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。

  • 简单:设计的易于使用和学习,阅读文档的时间更短。

  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。

  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。


标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。



依赖


  • Starlette 负责 web 部分。
  • Pydantic 负责数据部分。


Starlette

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 命令含义如下:


  • main:main.py 文件(一个 Python「模块」)。
  • app:在 main.py 文件中通过 app = FastAPI() 创建的对象。
  • --reload:让服务器在更新代码后重新启动。仅在开发时使用该选项。
  • --port指定端口


第一个接口

from fastapi import FastAPI


app = FastAPI()


@app.get("/")
def root():
return {"message": "Hello FastAPI"}

说明:

第一行代码: 导入FastAPI, ​​FastAPI​ 是一个为你的 API 提供了所有功能的 Python 类

第二行代码: ​​app​​ 会是 ​​FastAPI​​ 类的一个「实例」

第三行代码: 告诉 FastAPI 在它下方的函数负责处理如下访问请求:


  • 请求路径为 /
  • 使用 get 操作


打开浏览器访问 http://127.0.0.1:8888



{"message":"Hello FastAPI"}


打开交互式API文档

xxxxxxxxxx

 

1

http://127.0.0.1:8888/docs

将会看到自动生成的交互式 API 文档(由 Swagger UI 提供)

轻松入门FastAPI框架开发Restful API_ico



总之只需要下面5步, 即可完成一个接口,是不是很简单.


  • 导入 FastAPI。
  • 创建一个 app 实例。
  • 编写一个路径操作装饰器(如 @app.get("/"))。
  • 编写一个路径操作函数(如上面的 def root(): ...)。
  • 运行开发服务器(如 uvicorn main:app --reload --port 8888)


项目文件结构

如果你正在开发一个应用程序或 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​​ 给分离开来了

说明:


  • prefix 参数,路由的前缀
  • tags 将应用于特定路径操作的内容
  • responses 指特定于该路径下的响应内容,如上述便指定 404 的返回信息


写完模块后,还有最后一步,将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)

说明:


  • prefix: 路径
  • tags: 只是一个标签


打开http://127.0.0.1:8888/docs交互式文档,可以看两个应用下的接口.

轻松入门FastAPI框架开发Restful API_python_02



请求体

当你需要将数据从客户端(例如浏览器)发送给 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

轻松入门FastAPI框架开发Restful API_服务器_03


轻松入门FastAPI框架开发Restful API_python_04



提示:
你不能使用 GET 操作(HTTP 方法)发送请求体。


举报

相关推荐

0 条评论