做外贸网站怎么访问外国网站,网站建设瀑布流,视频网站做视频容易火,京津冀协同发展调研报告一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理#xff0c;使应用程序能够处理各种不同的请求场景#xff0c;提高应用程序的灵活性和可扩展性。 在数据验证和转换方面#xff0c;高级用法提供了更精细和准确的控制#…一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理使应用程序能够处理各种不同的请求场景提高应用程序的灵活性和可扩展性。 在数据验证和转换方面高级用法提供了更精细和准确的控制确保输入数据的质量和安全性。它还能更高效地处理异步操作提升应用程序的性能和响应速度特别是在处理大量并发请求时优势明显。 此外高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化以及实现更严格的认证和授权机制保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。 本篇学习如何在FastAPI中直接使用Request对象和如何使用数据类Dataclasses。 二、术语
2.1. Request对象 是用于处理 HTTP 请求的核心对象它提供了许多功能和属性以便更灵活地处理和访问客户端发送的请求信息。例如获取客户端的IP地址/主机可以通过访问Request对象来实现。
2.2. middleware函数 middleware函数中间件它在每个请求被特定的路径操作处理之前以及在每个响应返回之前工作。可以用于实现多种通用功能例如身份验证、日志记录、错误处理、请求处理、缓存等。其主要作用是在请求和响应的处理过程中添加额外的处理逻辑而无需在每个具体的路由处理函数中重复编写这些逻辑。 一般在碰到以下需求场景时可以考虑使用中间件来实现
身份验证验证请求的身份如检查 JWT token 或使用 OAuth2 进行验证日志记录记录请求和响应的日志包括请求方法、URL、响应状态码等信息错误处理处理应用程序中的异常情况捕获异常并返回自定义的错误响应请求处理对请求进行处理例如解析请求参数、验证请求数据等缓存在中间件中检查缓存中是否存在请求的响应如果存在则直接返回缓存的响应。
2.3. dataclasses 表示类和函数的一种轻量级数据定义方式。通过 dataclass 装饰的数据类具有以下特点和优势
自动生成方法无需手动编写繁琐的 __init__、__repr__ 等方法装饰器会自动添加这些方法。默认值和类型提示可以为属性设置默认值并添加类型提示提高代码的可读性和可维护性。不可变实例通过设置 frozenTrue可以创建不可变的实例增加代码的稳定性防止对象被意外修改。类型检查和验证支持类型检查和验证可使用 field 函数添加对属性的验证规则。自动生成合理的 __repr__ 和 __eq__ 方法方便比较和输出对象。继承和默认值工厂支持继承和默认值工厂使复杂的类层次结构定义更简单。可转换为字典或元组提供了 asdict 和 astuple 函数方便将数据类实例转换为字典或元组。 三、前置条件
3.1. 创建虚拟环境安装依赖
conda create -n fastapi_test python3.10
conda activate fastapi_test
pip install fastapi uvicorn 四、技术实现
4.1. 使用Request对象实现黑名单访问拦截
# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI, Request, HTTPException
from starlette import statusapp FastAPI()black_list [192.168.102.88]app.middleware(http)
async def my_middleware(request: Request, call_next):client_host request.client.hostprint(fclient_host: {client_host})if client_host in black_list:raise HTTPException(status_codestatus.HTTP_403_FORBIDDEN,detailProhibit access)else:response await call_next(request)return responseapp.get(/items/)
async def read_items():return [{item_id: Foo}]if __name__ __main__:uvicorn.run(app, host0.0.0.0,port7777)调用结果
正常访问未命中黑名单 非法访问命中黑名单 4.2. 使用dataclasses
# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from dataclasses import dataclass
from typing import Unionapp FastAPI()dataclass
class Item:name: strprice: floatdescription: Union[str, None] Nonetax: Union[float, None] Noneapp.post(/items/)
async def read_items(item: Item):print(fitem: {item})return itemif __name__ __main__:uvicorn.run(app, host0.0.0.0,port7777)
调用结果
使用pycharm的Http Request功能进行测试 选择POST Text Body自动创建请求模版 修改IP和端口填写请求参数 执行并观察结果 五、附带说明
5.1.不使用dataclasses的示例
# -*- coding: utf-8 -*-
import uvicorn
from fastapi import FastAPI
from typing import Unionapp FastAPI()app.post(/items1)
async def read_items(name: str,price: float,description: Union[str, None],tax: Union[float, None] ):item Item(name name,priceprice,descriptiondescription,taxtax)return itemif __name__ __main__:uvicorn.run(app, host0.0.0.0,port7777)调用结果
使用pycharm的Http Request功能进行测试 使用dataclasses vs 不使用dataclasses说明
使用dataclasses代码更加简洁、易读并且不易出错使用dataclasses使得代码在不同的上下文中更易于使用和扩展使用dataclasses增强了代码的可读性和可维护性。