Fast API 测试记录

13 篇文章 0 订阅
3 篇文章 0 订阅

FASTAPI

特点:

  1. 编辑器支持
  2. 数据格式自动转换
  3. 数据格式自动校验
  4. 自动生成注解和文档

 

  • 请求参数、路径参数、 RequestBody参数。

 

  • Request body参数继承自BaseModel。

 

  • fastAPI请求函数会对参数按照以下顺序进行识别:

 

  1. 如果这个参数已经再路径中被声明过,那么它就是一个请求参数。
  2. 如果这个参数的类型是单类型(如str,float, int, bool)等,那么它就是一个请求参数。
  3. 如果这个参数的类型是Pydantic数据模型,那么它就被认为是Request Body参数。

 

  • 当“item”是request body内部数据内容的键值,那么我们就需要利用body方法embed参数,才能正确解析出request body内容。

item : Item = Body(… , embed=True)

 

 

  • FastAPI支持为路径参数、请求参数添加附加信息,起到辅助说明校验的作用。对请求参数附加信息的支持,FastAPI通过Query模块来实现。
  • FastAPI基于模块可以支持请求参数列表,请求参数可以在URL中多次出现
  • 路径参数的额附加信息,也可以通过PATH来实现。注意路径参数在URL里是必选的,因此Path的第一个参数是…,即使你传递了None或其他缺省值,也不会影响参数的必须性。
  • 路径参数、请求参数的顺序问题
  1. 不带缺省值的参数应该放在前面,如过把带了缺省值的参数放在不带缺省值的前面,Python 会发出运行警告。因此在实际使用时,我们应该把不带缺省值的参数放在前面,无论这个参数是路径参数还是请求参数。Fast API根据参数名称、类型以及声明方法来识别具体参数的意义,并不关心参数顺序。
  2. 参数排序技巧,通过传递*作为第一个参数,就解决了上面参数顺序的问题。这是因为,Python 不会对*做任何操作。但通过识别*,Python知道后面的参数都是关键字参数(键值对),通常也叫Kwargs,无论参数是否有默认值。
  3. 数据类型参数的校验,借助Query、Path等模块你可以对字符串类型参数的校验,同样的,也可以是实现数字类型参数的校验功能。
    1.  gt : 大于(greater than)
    2.  ge: 大于或等于 (greater than or equal)
    3.  lt: 小于(less than)
    4.  le: 小于或等于(less than or  equal)

数字校验也同样适用于float类型的参数。

  1. Pydantic模型的附加信息。也可以通过Field的模块,为Pydantic模块添加附加信息。

 

 

  • 在路径操作中,我们可以用参数response_model来声明response模型。需要注意的是responnse_model是装饰器方法(get, post等)的参数。
    • 支持以下任意路径操作:
    • @app.get()
    • @app.post()
    • @app.put()
    • @app.delete()
  • FastAPI利用response模型实现以下功能:
    1. 将输出数据转换成声明的Response模型;
    2. 将数据进行校验
    3. 生成自动化文档
    4. (最重要)限制输出数据只能是所声明的Response模型。

例如,当我们设置多个输出模型的示例,在路径操作中,我们声明的Response模型可以通过指定,限制输出数据。

  • Response模型可以有多种形式,多种模型,比如:字典模型、列表模型、联合模型等。
  • Response可以用参数status_code来声明状态码

 

 

  • Fast API可以通过Form组件来接受表单数据。声明表单数据的方式与Query或者Path相同。Form的详细使用可以参考Query、PATH。它直接继承制自body

 

  • Fast API在进行数据存储或者传输的时候,有时候,我们需要把数据(比如Pydantic模型)转换成JSON兼容的格式(如Dict、list)等。FAST API提供了jsonable_encoder函数来实现。

 

  • 错误处理
  • 如果使用API时有错误发生,你需要通知客户端(web端或者API使用者)这个错误消息。

常见的错误信息为:

  • 客户端没有权限进行相关操作
  • 客户端找不到对应的路径操作
  • 客户端找不到对应的资源
  • 其他

这些错误的HTTP状态码一般为400错误(400-499)

  • 我们使用HTTPException模块返回带错误信息的Response。HTTPException是一个普通的Python异常,同时带有与API访问有关的附加数据。

From fastapi import HTTPException

抛出异常

在代码中抛出异常HTTPException.

Raise HTTPException(status_code=404, detail="Item not found")

 

  • 除了常见的异常操作外,也可以实现重写异常。假设我们有个自定义的异常UnicornException,我们想在全局范围内处理这个异常。借助@app.exception_handler(),就可以实现我们的目标。
  • FastAPI有一些缺省的异常处理器,当我们抛出HTTPException异常或者请求有非法数据的时候,这些处理器负责返回默认的JSON结果。我们可以重写这些异常处理器
  • 重写请求校验的异常处理器。当一个请求包含非法数据的时候,FastAPI内部会抛出RequestValidationError异常,并且有默认的异常处理器来处理。可以用@app.exception_handler(RequestValidationError)来重写这个异常处理器。

 

  • 中间件函数
  • 我们可以在FastAPI应用中,使用中间件。

中间件实际上是一个函数,在每个request处理之前被调用,同时又在每个response返回之前被调用。

  1. 首先接受访问过来的request
  2. 然后针对request或其他功能执行自定义逻辑
  3. 传递request给应用程序继续处理
  4. 接受应用所产生的response
  5. 然后针对response或其他功能执行自定义逻辑
  6. 返回response

 

后台任务(如果有)会在中间件执行完成后才会执行

 

我们通过在函数顶部添加装饰器@app.middleware("http")的方式来新建一个中间件。

 

中间件接受两个参数:
1. request

2.函数call_next:传递request给相应的路径操作,然后从路径操作中返回response。我们可以在response返回之前对其进行更改。

 

我们可以在调用函数call_next之前,即任何路径操作接收到request之前,添加一些自定义逻辑。

也可以在response产生之后,添加一些自定义逻辑,如上所示的添加自定义头信息。

 

  • @app.add_middleware(UnicornMiddleware, some_config=“rainbow”)

FastAPI通过app.add_middleware()操作来引入已定义的中间件。

其中,第一个参数是中间件类,同时还支持中间间的其他附加信息。

 

  • FastAPI提供了一些常用的中间件。
    • HTTPSRedirectMiddleware : HTTPSRedirectMiddleware 强制发来的请求协议必须是https或者wss
    • TrustedHostMiddleware: TrustedHostMiddleware强制发来的请求必须在Header信息中设置了Host选项,为了避开HTTP Host Header攻击
    • GZIPMiddleware: 当请求的头信息Accept-Encoding字段带有“gzip”时,GzipMiddleware负责完成相应的返回结果处理。

GzipMiddleware支持 minimum_size参数:当返回结果大大小小指定值时不启用压缩。

 

  • FastAPI依赖注入系统
  • “依赖注入”首先意味着在程序中我们的代码可以声明一些它必须依赖的项:我们称之为dependencies,也就是依赖项。然后,在实际运行中,FastAPI会把所有需要的依赖项提供给你的代码,称之为“注入”依赖项。

 

"依赖注入"非常适用于以下使用场景:

  1. 业务逻辑复用
  2. 共享数据库链接
  3. 安全机制、权限校验、角色管理等等
  4. 其他使用场景

所有上述使用场景,借助于“依赖注入”可以明确提高代码复用,减少代码重复

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值