Python 高性能 web 框架 - FastApi 全面指南

一、简介

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

它具有如下这些优点:

  • 快速:可与 NodeJSGo 比肩的极高性能(归功于 Starlette 和 Pydantic)
  • 高效编码:提高功能开发速度约 200% 至 300%
  • 更少 bug:减少约 40% 的人为(开发者)导致错误。
  • 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间
  • 简单:设计的易于使用和学习,阅读文档的时间更短
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。

二、安装

pip install fastapi

ASGI 服务器可以使用uvicorn:

pip install uvicorn[standard]

三、简单示例

创建一个 main.py 文件并写入以下内容:

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}

启动服务器:

uvicorn main:app --reload

访问URL:http://127.0.0.1:8000/items/5?q=somequery,你将会看到如下 JSON 响应:

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

访问URL:http://127.0.0.1:8000/docs,你会看到自动生成的交互式 API 文档,由Swagger UI 生成:

Python 高性能 web 框架 - FastApi 全面指南_第1张图片

访问URL:http://127.0.0.1:8000/redoc,你会看到另一个自动生成的文档(由ReDoc生成):

Python 高性能 web 框架 - FastApi 全面指南_第2张图片

四、请求

使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量":

from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")

async def read_item(item_id):

    return {
   "item_id": item_id}

路径参数item_id的值将作为参数item_id传递给你的函数。声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数:

from fastapi import FastAPI

app = FastAPI()

fake_items_db = [{
   "item_name": "Foo"}, {
   "item_name": "Bar"}, {
   "item_name": "Baz"}]


@app.get("/items/")

async def read_item(skip: int = 0, limit: int = 10):

    return fake_items_db[skip : skip + limit]

查询字符串是键值对的集合,这些键值对位于 URL 的之后,并以&符号分隔。

可以使用Query对查询进行额外的校验

from typing import Optional


from fastapi import FastAPI, Query

app = FastAPI()


@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, max_length=50)):
    results = {
   "items": [{
   "item_id": "Foo"}, {
   "item_id": "Bar"}]}
    if q:
        results.update({
   "q": q})
    return results

Query 有如下这些字段校验:

  • min_length 最小长度
  • max_length 最大长度
  • regex 正则匹配
  • Query 第一个参数为默认值,...表示是必需的

Path和Query用法一样,也能对查询字段进行校验。

而且你还可以声明数值校验:

from fastapi import FastAPI, Path, Query

app = FastAPI()


@app.get("/items/{item_id}")
async def read_items(
    *,
    item_id: int = Path(..., title="The ID of the item to get", ge=0, le=1000),
    q: str,

    size: float = Query(..., gt=0, lt=10.5)

):
    results = {
   "item_id": item_id}
    if q:
        results.update({
   "q": q})
    return results

  • gt:大于
  • ge:大于等于
  • lt:小于
  • le:小于等于

类似的还有Cookie

from typing import Optional


from fastapi import Cookie, FastAPI


app = Fa

你可能感兴趣的:(python,架构)