FastAPI 构建 API 高性能的 web 框架(二)

上一篇 FastAPI 构建 API 高性能的 web 框架(一)是把LLM模型使用Fastapi的一些例子,本篇简单来看一下FastAPI的一些细节。

有中文官方文档:fastapi中文文档

假如你想将应用程序部署到生产环境,你可能要执行以下操作:

复制代码
pip install fastapi

并且安装uvicorn来作为服务器:

复制代码
pip install "uvicorn[standard]"

然后对你想使用的每个可选依赖项也执行相同的操作。


文章目录

  • [1 基础使用](#1 基础使用)
    • [1.1 单个值Query的使用](#1.1 单个值Query的使用)
    • [1.2 多个参数](#1.2 多个参数)
    • [1.3 请求参数 Field](#1.3 请求参数 Field)
    • [1.4 响应模型`response_model`](#1.4 响应模型response_model)
    • [1.5 请求文件UploadFile](#1.5 请求文件UploadFile)
    • [1.6 CORS(跨域资源共享)](#1.6 CORS(跨域资源共享))
    • [1.7 与SQL 通信](#1.7 与SQL 通信)

1 基础使用

参考:https://fastapi.tiangolo.com/zh/tutorial/body-multiple-params/

1.1 单个值Query的使用

复制代码
from typing import Union

from fastapi import FastAPI, Query

app = FastAPI()


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

这里Union[str, None] 代表参数q,可以是字符型也可以None不填,Query用来更多的补充信息,比如这个参数,默认值是None,最大长度50

1.2 多个参数

复制代码
from typing import Annotated

from fastapi import FastAPI, Path
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
# 检查项,不同key要遵从什么格式
    name: str
    description: str | None = None # 字符或者None都可以,默认None
    price: float
    tax: float | None = None # 数值或者None都可以,默认None


@app.put("/items/{item_id}")
async def update_item(
    item_id: Annotated[int, Path(title="The ID of the item to get", ge=0, le=1000)], # item_id是一个路径,通过Annotated需要两次验证,验证一,是否是整数型,验证二,数值大小 大于等于0,小于等于1000
    q: str | None = None, 
    item: Item | None = None, # 格式遵从class Item类且默认为None
):
    results = {"item_id": item_id}
    if q:
        results.update({"q": q})
    if item:
        results.update({"item": item})
    return results

1.3 请求参数 Field

pydantic中比较常见

复制代码
from typing import Annotated

from fastapi import Body, FastAPI
from pydantic import BaseModel, Field

app = FastAPI()


class Item(BaseModel):
    name: str
    description: str | None = Field(
        default=None, title="The description of the item", max_length=300
    )
    # 跟Query比较相似,设置默认,title解释,最大长度300
    price: float = Field(gt=0, description="The price must be greater than zero")
    # price大于0,且是float形式
    tax: float | None = None


@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Annotated[Item, Body(embed=True)]):
    results = {"item_id": item_id, "item": item}
    return results

1.4 响应模型response_model

参考:https://fastapi.tiangolo.com/zh/tutorial/response-model/

复制代码
from typing import Any

from fastapi import FastAPI
from pydantic import BaseModel, EmailStr

app = FastAPI()


class UserIn(BaseModel):
    username: str
    password: str
    email: EmailStr
    full_name: str | None = None


class UserOut(BaseModel):
    username: str
    email: EmailStr
    full_name: str | None = None


@app.post("/user/", response_model=UserOut)
async def create_user(user: UserIn) -> Any:
    return user

response_model是控制输出的内容,按照规定的格式输出,作用概括为:

  • 将输出数据转换为其声明的类型。
  • 校验数据。
  • 在 OpenAPI 的路径操作中为响应添加一个 JSON Schema。
  • 并在自动生成文档系统中使用。

1.5 请求文件UploadFile

https://fastapi.tiangolo.com/zh/tutorial/request-files/

复制代码
from fastapi import FastAPI, File, UploadFile

app = FastAPI()


@app.post("/files/")
async def create_file(file: bytes = File()):
    return {"file_size": len(file)}


@app.post("/uploadfile/")
async def create_upload_file(file: UploadFile):
    return {"filename": file.filename}

UploadFile 与 bytes 相比有更多优势:

  • 这种方式更适于处理图像、视频、二进制文件等大型文件,好处是不会占用所有内存;
  • 可获取上传文件的元数据;

1.6 CORS(跨域资源共享)

https://fastapi.tiangolo.com/zh/tutorial/cors/

你可以在 FastAPI 应用中使用 CORSMiddleware 来配置它。

  • 导入 CORSMiddleware。

  • 创建一个允许的源列表(由字符串组成)。

  • 将其作为「中间件」添加到你的 FastAPI 应用中。

    from fastapi import FastAPI
    from fastapi.middleware.cors import CORSMiddleware

    app = FastAPI()

    origins = [
    "http://localhost.tiangolo.com",
    "https://localhost.tiangolo.com",
    "http://localhost",
    "http://localhost:8080",
    ]

    app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=[""],
    allow_headers=["
    "],
    )

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

  • allow_origins - 一个允许跨域请求的源列表。例如 ['https://example.org', 'https://www.example.org']。你可以使用 ['*'] 允许任何源。

1.7 与SQL 通信

https://fastapi.tiangolo.com/zh/tutorial/sql-databases/

FastAPI可与任何数据库在任何样式的库中一起与 数据库进行通信。


相关推荐
YeeWang5 分钟前
🎉 Eficy 让你的 Cherry Studio 直接生成可预览的 React 页面
前端·javascript
造梦师阿鹏5 分钟前
004.从 API 裸调到 LangChain
经验分享·ai·大模型·ai技术·大模型应用开发
gnip6 分钟前
Jenkins部署前端项目实战方案
前端·javascript·架构
Orange30151121 分钟前
《深入源码理解webpack构建流程》
前端·javascript·webpack·typescript·node.js·es6
lovepenny43 分钟前
Failed to resolve entry for package "js-demo-tools". The package may have ......
前端·npm
WSSWWWSSW1 小时前
Matplotlib数据可视化实战:Matplotlib子图布局与管理入门
python·信息可视化·matplotlib
WSSWWWSSW1 小时前
Matplotlib数据可视化实战:Matplotlib图表美化与进阶教程
python·信息可视化·matplotlib
超凌1 小时前
threejs 创建了10w条THREE.Line,销毁数据,等待了10秒
前端
-Xie-1 小时前
Maven(二)
java·开发语言·maven
mftang1 小时前
Python可视化工具-Bokeh:动态显示数据
开发语言·python