fastapi 总结2

@ 响应模型就是函数前面的装饰器添加‘response_model’字段, :

@app.post("/items/", response_model=Item)

 功能包括:

1,将输出数据转为声明类型

2,验证数据

3,在openapi路径操作中为响应添加json模式

4,自动文档

5,将输出数据限制为模型数据

@ 响应模型在此参数中声明而不是作为函数返回类型注释,因为路径函数实际上可能不会返回该响应模型,而是返回一个dict, 数据库对象或一些其他模型,然后使用response_model来执行字段限制和连载。

@

FastAPI将负责过滤掉所有未在输出模型中声明的数据(使用 Pydantic)

@  响应模型可以具有默认值,这样返回的json就可以不用指定该参数

@ 如果你不想发送默认值很长的json响应,可以设置response_model_exclude_unset为True表示,默认值不会包含在响应中,只会包含实际设置的值。FastAPI通过使用Pydantic模型.dict()与它的exclude_unset参数来实现这一目标。

@你还可以使用:

  • response_model_exclude_defaults=True
  • response_model_exclude_none=True

排除对应的数据

@请注意,默认值可以是任何值,而不仅仅是None.

@您还可以使用路径操作装饰器参数response_model_include和response_model_exclude. 通过设定key来指定或排除model中的某些属性。格式为一个set,list会自动转set

@ 减少重复,使用继承

@您可以将响应声明Union为两种类型,这意味着响应可以是这两种类型中的任何一种。使用typing中的Union【】,你需要注意添加的顺序,具体的类型应该放在前面

@同样,你可以声明model列表等复合类型

@ 声明dict类型可以返回你不知道有效字段的响应。

@ 在装饰器中定义status_code 声明当前路径操作的响应HTTP状态码,该参数接收int,还可以接收IntEnum。例如 Python 的http.HTTPStatus

@ 作用包括在响应中返回状态码,在文档中记录它

@ fastapi模块中的FastAPI 是代表http状态码的枚举,你可以使用这个而不是单独的数值

@ 当需要接收表单字段而不是json时,使用Form参数。要使用表单,首先安装python-multipart.例如pip install python-multipart。

@app.post("/login/") async def login(username: str = Form(...), password: str = Form(...)): return {"username": username}

@要声明表单主体,您需要Form显式使用,因为没有它,参数将被解释为查询参数或主体 (JSON) 参数。

@HTML 表单 ( <form></form>) 向服务器发送数据的方式通常对该数据使用“特殊”编码,它与 JSON 不同。

FastAPI将确保从正确的位置而不是 JSON 读取数据。

@ 要接收上传的文件,首先安装python-multipart.例如pip install python-multipart。这是因为上传的文件是作为“表单数据”发送的。

@ 要声明文件主体,您需要使用File,否则参数将被解释为查询参数或主体 (JSON) 参数。

@文件将作为“表单数据”上传。如果您将路径操作函数参数的类型声明为bytes,FastAPI将为您读取文件,您将收到内容为bytes.请记住,这意味着整个内容将存储在内存中。这将适用于小文件。使用UploadFile

@使用UploadFile具有以下几个优点bytes:

  • 它使用“假脱机”文件:
  • 存储在内存中的文件达到最大大小限制,超过此限制后,它将存储在磁盘中。
  • 这意味着它可以很好地处理大文件,如图像、视频、大型二进制文件等,而不会消耗所有内存。
  • 您可以从上传的文件中获取元数据。
  • 它有一个类似文件的 async界面。
  • 它公开了一个实际的 PythonSpooledTemporaryFile对象,您可以将其直接传递给其他需要类似文件的对象的库。

@UploadFile 具有以下属性:

  • filename: Astr带有上传的原始文件名(例如myimage.jpg)。
  • content_type:Astr与内容类型(MIME 类型/媒体类型)(例如image/jpeg)。
  • file:A SpooledTemporaryFile(类文件对象)。这是实际的 Python 文件,您可以将其直接传递给其他需要“类文件”对象的函数或库。

@UploadFile有以下async方法。它们都在下面调用相应的文件方法(使用内部SpooledTemporaryFile)。

  • write(data): 写入data(strbytes) 到文件。
  • read(size):读取文件的sizeint) 个字节/字符。
  • seek(offset): 转到文件中的字节位置offsetint)。
  • close(): 关闭文件。

由于所有这些方法都是async方法,因此您需要“等待”它们。

@ 您可以在路径操作中声明多个File和Form参数,但也不能声明您希望以 JSON 形式接收的字段,因为请求将使用代替 对正文进行编码。Bodymultipart/form-dataapplication/json。这不是FastAPI的限制,它是 HTTP 协议的一部分。

@多文件上传:FastAPI提供相同starlette.responses的fastapi.responses,就像为你的方便,开发人员。但大多数可用的响应直接来自 Starlette。

@您可以使用FileForm来同时定义文件和表单字段。要接收上传的文件和/或表单数据,首先安装python-multipart.

@ 您可以在路径操作中声明多个File和Form参数,但也不能声明您希望接收为 JSON 的字段,因为请求的正文将使用multipart/form-data代替application/json进行编码。这不是FastAPI的限制,它是 HTTP 协议的一部分。

@ 使用HTTPException 向客户端报告异常。

@ raise HTTPException(status_code=404, detail="Item not found")。 引发HTTPException,您可以传递任何可以转换为 JSON 的值作为参数detail,而不仅仅是str.

@ HTTPException headers 参数是为HTTP错误添加自定义标头

@ 自定义异常处理程序:

@覆盖默认的异常傅里程序:fastAPI有一些默认的异常处理程序,负责处理返回默认的json响应。使用

app.exception_handler覆盖默认的异常处理程序。

@FastAPI的HTTPException与 Starlette 的HTTPException的对别:FastAPI的HTTPException错误类继承自 Starlette 的HTTPException错误类。唯一的区别是,FastAPI的HTTPException允许您添加要包含在响应头。当你注册一个异常处理程序时,你应该使用 Starlette 的HTTPException.这样,如果 Starlette 的内部代码或 Starlette 扩展或插件的任何部分引发 Starlette HTTPException,您的处理程序将能够捕获并处理它。

@ 重用FastApi的异常处理程序:

http_exception_handler,

request_validation_exception_handler,

@ 路径操作装饰器的所有参数:

  1. Status_codes: 响应返回的状态代码
  2. tags:使用list或str
  3. summary:总结,API自动文档
  4. description:路径操作的描述,API自动文档
  5. 由于描述往往很长并且涵盖多行,您可以在函数docstring 中声明路径操作描述,FastAPI将从那里读取它,并且可以不用配置
  6. response_description:响应描述
  7. desprecated:API弃用标志

@ 某些情况下需要转换数据类型(如pydantic模型)与Json兼容的东西。如需要将model存在数据库

@使用fastapi.encoders 将会把对象(如model)转换为json兼容版本。

@jsonable_encoder  FastAPI内部实际上使用来转换数据。但它在许多其他场景中很有用。

@ 作用:共享代码,共享数据库连接,安全验证,

@与body、query相同,在路径操作函数中定义Depends参数,该参数必须是一个函数,且该函数与路径操作函数接收相同的参数。当然依赖项可以不止是函数。

@ 当有新请求到达时,FastAPI如下处理:

1.使用正确的参数调用您的依赖项函数。

2.从您的函数中获取结果

3.将该结果分配给路径操作函数中的参数

@ 依赖项函数也可以使用async

@ 依赖项也会自动交互式文档

@依赖注入系统的简单性使得FastAPI兼容:

  • 所有关系数据库
  • NoSQL 数据库
  • 外部包
  • 外部 API
  • 认证和授权系统
  • API 使用监控系统
  • 响应数据注入系统
  • 等等。

@可以定义依赖项,而这些依赖项又可以定义依赖项本身。最后,构建了一个分层的依赖关系树,依赖注入系统负责为您(及其子依赖)解决所有这些依赖关系,并在每一步提供(注入)结果。

作为依赖的类:

@ 只要是可调用的,就可以作为依赖项

@如果在FastAPI 中传递“可调用”作为依赖,它将分析该“可调用”的参数,并以与路径操作函数的参数相同的方式处理它们。包括子依赖。

@我们可以将依赖方法改为一个对象的初始化函数。这样依赖项返回的就是一个对象

@ 为了避免代码重复:commons: CommonQueryParams = Depends(CommonQueryParams) FastAPI为这种情况提供了快捷方法,当依赖项是一个类时,Depends将声明的类作为其默认值。

子依赖

@ 依赖函数的参数仍是一个依赖函数。

@当一个依赖项为同一个路径操作操作多次声明,例如多个依赖项有一个共同的子依赖项,FastAPI知道每个请求只调用该子依赖项一次。它将返回的值保存在缓存中,并将其传递给其特定请求中需要它的所有依赖项,当然你也可以不适用缓存,而是对每一步都调用依赖项。在Depends中使用use_cache参数设置为False

路径操作装饰器中的依赖关系

@ Depends 用于函数参数,dependencies用于路径函数装饰器

@ 前提:不需要路径操作函数返回的值,或者没有返回值。

@ 可以像普通依赖项一样raise 错误。

@ 他们可以返回或不返回值,这些值不会被使用

全局依赖

@对于某些类型的应用程序,您可能希望向整个应用程序添加依赖项。

app = FastAPI(dependencies=[Depends(verify_token), Depends(verify_key)])

与yield的依赖关系

@ 使用yield替代return,可以执行一些额外步骤的依赖项

@ yield在try之间可以确保执行finally,但不会执行exception 捕获异常,with也不会, 理解多线程。

@ 确保使用yield一次。否者fastapi报异常

@ 可以使用任何的依赖项组合

@ 不要再finilly中发送其他响应

 

@ 应用程序应该是有自己的文件结构

@ 我们可以将APIRouter视为一个【迷你FastAPI】类。所有相同的选项都支持,包括parameters,responses,dependencies,tags等等。

@ apirouter主要用于在其他文件中定义fastapi,其与主界面的FastAPI 没有太大差异

@ 针对apirouter 生成的特定装饰器函数,我们想要生成特定于该路径操作的额外(注意不是替换)操作,可以在装饰器里添加参数,多个操作参数(如depends)的执行顺序,从主FastAPI到内部router

@使用 app.include_router(),我们可以将每个 APIRouter 添加到主 FastAPI 应用程序中。它将包含来自该路由器的所有路由作为其一部分。

@ 即使APIRouter定义时没有声明 相关参数:prefix,dependencies等。我们仍然可以在include_router时添加对应的参数。这样原始的APIRouter将保持不变,我们仍然可以与组织中的其他项目共享相同的文件。同时这只会影响我们应用中的APIRouter,不会影响其他使用它的代码。

@

@  可以在另一个 APIRouter 中包含 APIRouter, 确保在 router 包含到 FastAPI 应用程序之前进行此操作,以便 other_router 中的路径操作也能被包含进来。

@ ????????

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值