Python+FastAPI开发Web接口

1,623 阅读4分钟

前言

当我第一次看到Python + FastAPI这个组合的时候,瞬间就来了兴趣(为什么有兴趣,可以看文末FastAPI亮点章节),所以果断的踏上了“长脑子”的道路,天选打工人们,一起开始折腾吧~

正文

一、安装FastAPI

由于FastAPI本身不支持ASGI服务,所以需要结合Uvicor这类的ASGI框架进行配套使用,所以至少安装FastAPI以及Uvicor两个模块。

pip install fastapi uvicor

二、启动服务

from fastapi import FastAPI
import uvicorn

app = FastAPI()


@app.get("/")
def home():
    return {"Hello":"World1"}

if __name__ == '__main__':
    uvicorn.run(app)

按照上述方式编写代码后运行,就可以通过 http://127.0.0.1:8000 方式访问了。

三、部分常用配置

3.1访问地址配置

默认启动服务后,访问站点只能通过localhost或者127.0.0.1进行访问,如果想通过本地(服务器)ip进行访问,需要设置启动服务的参数,增加host配置,具体配置如下:

uvicorn.run("main:app", host="0.0.0.0")

3.2 端口配置

uvicorn服务默认端口为8000,如果要自定义,可以在启动服务时增加port参数配置:

uvicorn.run("main:app", host="0.0.0.0", port=5000)

3.2 热加载

uvicorn服务默认热加载服务是关闭的,如果要打开,可以在启动服务时增加reload参数配置:

uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True)

注:

1、不知道是uvicorn版本问题还是新版Pycharm的问题,热加载服务响应非常的慢,有时甚至不会生效,遇到这种情况时可以使用uvicorn的0.21.0版本即可。

2、这里的热加载监测为项目工程文件,如果想指定某一目录热加载生效,可以配套watchgod服务进行使用。

3.3 watchgod服务安装使用(无需指定热加载目录,可跳过)

3.3.1 安装watchgod
 pip install watchgod
3.3.2 watchgod使用

在启动服务时指定reload_dirs参数可以指定热加载生效的目录,其余目录热加载将不再生效,具体配置如下:

uvicorn.run("main:app", host="0.0.0.0", port=5000, reload=True, reload_dirs="src")

四、路由使用

4.1 定义路由

FastAPI提供了多种路由装饰器来定义响应HTTP以及Websocket事件,包括:

  • @app.get(): 处理 HTTP GET 请求。
  • @app.post(): 处理 HTTP POST 请求。
  • @app.put(): 处理 HTTP PUT 请求。
  • @app.delete(): 处理 HTTP DELETE 请求。
  • @app.options(): 处理 HTTP OPTIONS 请求。
  • @app.patch() : 处理 HTTP PATCH 请求。
  • @app.head(): 处理 HTTP HEAD 请求。
  • @app.trace() : 处理 HTTP TRACE 请求。
  • @app.connect() : 处理 WebSocket 连接。
  • @app.websocket() : 处理 WebSocket 事件。

使用示例:

@app.get("/")
def home():
    """
    get路由使用示例
    :return: 
    """
    return {"Hello": "World"}


@app.post("/login")
def login():
    """
    pot路由使用示例
    :return: 
    """
    return {"code": 200}


@app.put("/items/{item_id}")
async def update_item(item_id: int):
    """
    put路由使用示例
    :param item_id: 
    :return: 
    """
    return {"item_id": item_id}


@app.delete("/del/items/{item_id}")
async def delete_item(item_id: int):
    """
    delete路由使用示例
    :param item_id: 
    :return: 
    """
    return {"item_id": item_id}
    
......more

4.2 路由参数

在 FastAPI 中路由参数包括路径参数查询参数以及请求参数几大类。

路径参数

路径参数用于从 URL 路径中提取值。它们通常用于标识资源。在API开发过程中常用于传递标识符,接收方通过获取路径参数就可以直接处理目标业务了。

@app.get("/item/{item_id}")
def getItem(item_id: int):
    return {"item_id": item_id}

查询参数

查询参数用于从 URL 的查询字符串中提取值。它们通常用于过滤或排序数据。相比上述路径参数而言,不会将路由地址进行固化,相对灵活!以下示例中的item_id是可以不用传递的,也可以直接拼接在路由路劲中直接访问:

@app.get("/item")
def getItem2(item_id: int = None):
    return {"item_id": item_id}

请求体 请求体参数这里以json数据格式为例,将json数据作为请求体发起请求:

class Item(BaseModel):
    id: int
    name: str

@app.put("/create/item")
def create_item(item: Item):
    return item

四、FastAPI亮点

使用FastAPI我个人喜欢的最直接的两个优势就是自动序列化自动生成API文档

自动序列化

FastAPI可以将返回的任何字典dict数据进行序列化,无需再像Flask那样使用jsonify进行序列化了。就算是复杂的数据结构,只要使用Pydantic进行定义,也可以完成自动化(如上述请求体一样)。

自动生成API文档

默认情况下FastAPI 支持 OpenAPI 以及 Swagger UI 和 ReDoc。这意味着会自动记录生成我们的API文档,我们无需额外操作就可以查看我们定义的所有API信息。查看方式如下:

// 访问openapi类型文档
http://127.0.0.1:5000/openapi.json

// 访问Swagger UI类型文档
http://127.0.0.1:5000/docs

// 访问ReDoc类型文档
http://127.0.0.1:5000/redoc

image.png

结束

好像是“长了点脑子”,你呢?