轻松入门FastAPI框架开发Restful API

关注公众号《DevOps运维民工》,将获取更多运维干货

目录

简介

Starlette

安装

第一个接口

项目文件结构

请求体

更多文章请扫一扫


简介

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文档

http://127.0.0.1:8888/docs

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

轻松入门FastAPI框架开发Restful API_第1张图片

 

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

  1. 导入 FastAPI。
  2. 创建一个 app 实例。
  3. 编写一个路径操作装饰器(如 @app.get("/"))。
  4. 编写一个路径操作函数(如上面的 def root(): ...)。
  5. 运行开发服务器(如 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_第2张图片

请求体

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

 轻松入门FastAPI框架开发Restful API_第4张图片

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

更多文章请扫一扫

 扫描下面二维码关注公众号获取更多学习资源

轻松入门FastAPI框架开发Restful API_第5张图片

你可能感兴趣的:(restful,后端,python)