FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。
在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。
此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。
本篇学习如何在FastAPI中直接使用Request对象和如何使用数据类Dataclasses。
是用于处理 HTTP 请求的核心对象,它提供了许多功能和属性,以便更灵活地处理和访问客户端发送的请求信息。例如:获取客户端的IP地址/主机,可以通过访问Request
对象来实现。
middleware函数(中间件)它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作。可以用于实现多种通用功能,例如身份验证、日志记录、错误处理、请求处理、缓存等。其主要作用是在请求和响应的处理过程中添加额外的处理逻辑,而无需在每个具体的路由处理函数中重复编写这些逻辑。
一般在碰到以下需求场景时,可以考虑使用中间件来实现:
表示类和函数的一种轻量级数据定义方式。通过 @dataclass
装饰的数据类具有以下特点和优势:
__init__
、__repr__
等方法,装饰器会自动添加这些方法。frozen=True
,可以创建不可变的实例,增加代码的稳定性,防止对象被意外修改。field
函数添加对属性的验证规则。__repr__
和 __eq__
方法:方便比较和输出对象。asdict
和 astuple
函数,方便将数据类实例转换为字典或元组。增加Google Search以及langchainhub的依赖
conda create -n fastapi_test python=3.10 conda activate fastapi_test pip install fastapi uvicorn
# -*- coding: utf-8 -*- import uvicorn from fastapi import FastAPI, Request, HTTPException from starlette import status app = FastAPI() black_list = ['192.168.102.88'] @app.middleware("http") async def my_middleware(request: Request, call_next): client_host = request.client.host print(f"client_host: {client_host}") if client_host in black_list: raise HTTPException( status_code=status.HTTP_403_FORBIDDEN, detail="Prohibit access" ) else: response = await call_next(request) return response @app.get("/items/") async def read_items(): return [{"item_id": "Foo"}] if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0',port=7777)
调用结果:
正常访问,未命中黑名单:
非法访问,命中黑名单:
# -*- coding: utf-8 -*- import uvicorn from fastapi import FastAPI from dataclasses import dataclass from typing import Union app = FastAPI() @dataclass class Item: name: str price: float description: Union[str, None] = None tax: Union[float, None] = None @app.post("/items/") async def read_items(item: Item): print(f'item: {item}') return item if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0',port=7777)
调用结果:
使用pycharm的Http Request功能进行测试
选择POST Text Body,自动创建请求模版
修改IP和端口,填写请求参数
执行并观察结果
# -*- coding: utf-8 -*- import uvicorn from fastapi import FastAPI from typing import Union app = FastAPI() @app.post("/items1") async def read_items(name: str,price: float,description: Union[str, None],tax: Union[float, None] ): item = Item(name= name,price=price,description=description,tax=tax) return item if __name__ == '__main__': uvicorn.run(app, host='0.0.0.0',port=7777)
调用结果:
使用pycharm的Http Request功能进行测试
使用dataclasses vs 不使用dataclasses说明: