FASTAPI
特点:
- 编辑器支持
- 数据格式自动转换
- 数据格式自动校验
- 自动生成注解和文档
- 请求参数、路径参数、 RequestBody参数。
- Request body参数继承自BaseModel。
- fastAPI请求函数会对参数按照以下顺序进行识别:
- 如果这个参数已经再路径中被声明过,那么它就是一个请求参数。
- 如果这个参数的类型是单类型(如str,float, int, bool)等,那么它就是一个请求参数。
- 如果这个参数的类型是Pydantic数据模型,那么它就被认为是Request Body参数。
- 当“item”是request body内部数据内容的键值,那么我们就需要利用body方法embed参数,才能正确解析出request body内容。
item : Item = Body(… , embed=True)
- FastAPI支持为路径参数、请求参数添加附加信息,起到辅助说明校验的作用。对请求参数附加信息的支持,FastAPI通过Query模块来实现。
- FastAPI基于模块可以支持请求参数列表,请求参数可以在URL中多次出现
- 路径参数的额附加信息,也可以通过PATH来实现。注意路径参数在URL里是必选的,因此Path的第一个参数是…,即使你传递了None或其他缺省值,也不会影响参数的必须性。
- 路径参数、请求参数的顺序问题
- 不带缺省值的参数应该放在前面,如过把带了缺省值的参数放在不带缺省值的前面,Python 会发出运行警告。因此在实际使用时,我们应该把不带缺省值的参数放在前面,无论这个参数是路径参数还是请求参数。Fast API根据参数名称、类型以及声明方法来识别具体参数的意义,并不关心参数顺序。
- 参数排序技巧,通过传递*作为第一个参数,就解决了上面参数顺序的问题。这是因为,Python 不会对*做任何操作。但通过识别*,Python知道后面的参数都是关键字参数(键值对),通常也叫Kwargs,无论参数是否有默认值。
- 数据类型参数的校验,借助Query、Path等模块你可以对字符串类型参数的校验,同样的,也可以是实现数字类型参数的校验功能。
- gt : 大于(greater than)
- ge: 大于或等于 (greater than or equal)
- lt: 小于(less than)
- le: 小于或等于(less than or equal)
数字校验也同样适用于float类型的参数。
- Pydantic模型的附加信息。也可以通过Field的模块,为Pydantic模块添加附加信息。
- 在路径操作中,我们可以用参数response_model来声明response模型。需要注意的是responnse_model是装饰器方法(get, post等)的参数。
- 支持以下任意路径操作:
- @app.get()
- @app.post()
- @app.put()
- @app.delete()
- FastAPI利用response模型实现以下功能:
- 将输出数据转换成声明的Response模型;
- 将数据进行校验
- 生成自动化文档
- (最重要)限制输出数据只能是所声明的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返回之前被调用。
- 首先接受访问过来的request
- 然后针对request或其他功能执行自定义逻辑
- 传递request给应用程序继续处理
- 接受应用所产生的response
- 然后针对response或其他功能执行自定义逻辑
- 返回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会把所有需要的依赖项提供给你的代码,称之为“注入”依赖项。
"依赖注入"非常适用于以下使用场景:
- 业务逻辑复用
- 共享数据库链接
- 安全机制、权限校验、角色管理等等
- 其他使用场景
所有上述使用场景,借助于“依赖注入”可以明确提高代码复用,减少代码重复