赞
踩
FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。
在数据验证和转换方面,高级用法提供了更精细和准确的控制,确保输入数据的质量和安全性。它还能更高效地处理异步操作,提升应用程序的性能和响应速度,特别是在处理大量并发请求时优势明显。
此外,高级用法还有助于更好地整合数据库操作、实现数据的持久化和查询优化,以及实现更严格的认证和授权机制,保护应用程序的敏感数据和功能。总之,掌握 FastAPI 的高级用法可以帮助开发人员构建出功能更强大、性能更卓越、安全可靠的 Web 应用程序。
本篇学习如何在FastAPI中直接使用Request对象和如何使用数据类Dataclasses。
是用于处理 HTTP 请求的核心对象,它提供了许多功能和属性,以便更灵活地处理和访问客户端发送的请求信息。例如:获取客户端的IP地址/主机,可以通过访问Request
对象来实现。
middleware函数(中间件)它在每个请求被特定的路径操作处理之前,以及在每个响应返回之前工作。可以用于实现多种通用功能,例如身份验证、日志记录、错误处理、请求处理、缓存等。其主要作用是在请求和响应的处理过程中添加额外的处理逻辑,而无需在每个具体的路由处理函数中重复编写这些逻辑。
一般在碰到以下需求场景时,可以考虑使用中间件来实现:
表示类和函数的一种轻量级数据定义方式。通过 @dataclass
装饰的数据类具有以下特点和优势:
__init__
、__repr__
等方法,装饰器会自动添加这些方法。frozen=True
,可以创建不可变的实例,增加代码的稳定性,防止对象被意外修改。field
函数添加对属性的验证规则。__repr__
和 __eq__
方法:方便比较和输出对象。asdict
和 astuple
函数,方便将数据类实例转换为字典或元组。- 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说明:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。