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可与任何数据库在任何样式的库中一起与 数据库进行通信。


相关推荐
Evand J3 分钟前
【MATLAB例程】AOA与TDOA混合定位例程,适用于三维环境、4个锚点的情况,附下载链接
开发语言·matlab
机器视觉知识推荐、就业指导4 分钟前
Qt 与Halcon联合开发八: 结合Qt与Halcon实现海康相机采图显示(附源码)
开发语言·数码相机·qt
10年前端老司机4 分钟前
React 受控组件和非受控组件区别和使用场景
前端·javascript·react.js
夏晚星4 分钟前
vue实现微信聊天emoji表情
前端·javascript
停止重构6 分钟前
【方案】前端UI布局的绝技,响应式布局,多端适配
前端·网页布局·响应式布局·grid布局·网页适配多端
極光未晚7 分钟前
TypeScript在前端项目中的那些事儿:不止于类型的守护者
前端·javascript·typescript
ze_juejin8 分钟前
Vue3 + Vite + Ant Design Vue + Axios + Pinia 脚手架搭建
前端·vue.js
lichenyang45310 分钟前
React项目(移动app)
前端
用户618482402195111 分钟前
Vue-library-start,一个基于Vite的vue组件库开发模板
前端
美团技术团队22 分钟前
报名 | 美团技术沙龙第86期:多业务场景下,美团如何做性能优化
前端