呆鸟译Py呆鸟的Python数据分析

FastAPI官档精编001 - 简介

2021-09-06  本文已影响0人  呆鸟的简书

呆鸟云:发布本系列旨在推广 FastAPI 以及推进 FastAPI 中文官档翻译,目前,FastAPI 官档已完成 98% 的中文翻译,如果您对 FastAPI 有兴趣,可以为这个很赞的开源项目做些贡献,比如校译、翻译、审阅等。

开源项目的发展离不开大家的支持。当然最简单的就是在 Github 上点 Star 了。

如果您觉得 FastAPI 不错,也可以转发、转载本文,让更多人知道 Python 还有这么简单的后端支持库。

下面先列出几个需要 Review 的 PR,希望大家多多参与。

以下为正文。


文档https://fastapi.tiangolo.com
源码https://github.com/tiangolo/fastapi


FastAPI 是快速构建高效 API 的现代 Web 框架,它使用的是 Python 3.6+,并基于 Python 标准类型提示。

核心特性:

依赖项支持

安装

$ pip install fastapi

FastAPI 还需要 ASGI 服务器,生产环境下可以使用 Uvicorn 或 Hypercorn。

$ pip install uvicorn[standard]

示例

创建应用

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

如果代码中使用了 async / await,请配套使用 async def

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

运行

执行以下命令运行服务器:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

uvicorn main:app 命令含义如下:

查看文档

使用浏览器访问 http://127.0.0.1:8000/items/5?q=somequery

可以获得如下 JSON 响应:

{"item_id": 5, "q": "somequery"}

至此,我们就创建了具有以下功能的 API:

API 文档

访问 http://127.0.0.1:8000/docs

查看(由Swagger UI)自动生成的 API 文档:

Swagger UI

备选 API 文档

访问 http://127.0.0.1:8000/redoc

查看(由 ReDoc)自动生成的 API 文档:

ReDoc

更新示例

修改 main.py,从 PUT 请求中接收请求体。

借助 Pydantic 使用 Python 标准类型声明请求体。

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

(因为之前为 uvicorn 命令添加了 --reload 选项),服务器会自动重载。

更新 API 文档

访问 http://127.0.0.1:8000/docs

Swagger UI Swagger UI interaction Swagger UI interaction

更新备选文档

访问 http://127.0.0.1:8000/redoc

ReDoc

小结

总的来说,和声明函数的参数一样,只需声明一次参数类型和请求体。

在此,使用了现代 Python 的标准类型进行声明。

开发者不用学习新语法,也不用了解特定库的方法或类。

只要使用标准的 Python 3.6 及更高版本

举个例子,比如,声明 int 类型:

item_id: int

或者使用更复杂的 Item 模型:

item: Item

......只需一次声明,就可以获得以下好处:


回顾本章的代码示例,FastAPI 可以:


虽然本篇的介绍比较浅,但涵盖了 FastAPI 的所有工作原理。

试着把下面这行代码:

    return {"item_name": item.name, "item_id": item_id}

......从:

        ... "item_name": item.name ...

......改为:

        ... "item_price": item.price ...

......注意,编辑器可以自动补全属性,还能识别属性的类型:

editor support

可选依赖支持库

用于 Pydantic:

用于 Starlette:

用于 FastAPI / Starlette:

使用 pip install fastapi[all] 可安装上述所有依赖支持库。

许可协议

FastAPI 遵循 MIT 许可协议。

上一篇 下一篇

猜你喜欢

热点阅读