FastAPI是Python的一个Web框架
它提供了['GET', 'POST', 'DELETE', 'PUT']的请求接口,那么这些接口有什么作用和区别呢?
在这里,引入一个幂等性的概念,即相同的操作(请求)不论做多少次,最终的结果都是相同的。我们称这样的操作具有‘幂等性’。
这个概念主要是为了解释POST和PUT的区别。
POST和PUT向服务器提交数据,其中POST不具备幂等性,而PUT具有幂等性。举个例子,我用POST请求向服务器添加{‘name’:'misaka'}, 多向服务器请求三次,服务器里可能就会有{{‘name’:'misaka'},{‘name’:'misaka'},{‘name’:'misaka'}}。然而通过PUT请求,始终都是只有{‘name’:'misaka'}
总的来说就是 POST:创 建数据。 GET: 读取数据。 PUT :更新数据。 DELET E:删除数据。
GET请求的路径参数
用字符串形式写在@app.get()的括号内,如下所示
import uvicorn
from fastapi import FastAPI
import asyncio
app = FastAPI()
@app.get("/items/{item_id}") # 路径参数
async def read_item(item: int):
return {"item_id": item_id}
if __name__ == '__main__':
config = uvicorn.Config(app, host='127.0.0.1', port=8000)
server = uvicorn.Server(config)
asyncio.run(server.serve())
注意在这里的read_item方法参数为int类型,在Python中Pydantic会校验数据。
预设值
通过继承枚举类,并以此定义GET请求的参数类型。
import uvicorn
from fastapi import FastAPI
from enum import Enum
class ModelName(str, Enum):
alexnet = "alexnet"
resnet = "resnet"
lenet = "lenet"
app = FastAPI()
@app.get("/models/{model_name}")
async def get_model(model_name: ModelName):
if model_name is ModelName.alexnet:
return {"model_name": model_name, "message": "Deep Learning FTW!"}
if model_name.value == "lenet":
return {"model_name": model_name, "message": "LeCNN all the images"}
return {"model_name": model_name, "message": "Have some residuals"}
获取枚举值
model_name.value
包含路径的路径参数
import uvicorn
from fastapi import FastAPI
app = FastAPI()
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
return {"file_path": file_path}
Python知识补充_1: 了解Enum类
Enum是Python的枚举类。
可以直接定义,也可以通过继承的方式定义
Python知识补充_2: 标准库还有哪些像Enum这样常用的类
Python 中像 Enum
这样封装了特殊功能的内置类,属于标准库的一部分。这些类通常用来解决特定场景中的问题,简化开发过程。以下是一些常见的类似 Enum
的内置类:
1. dataclasses
用于简化数据类的定义,自动生成 __init__
、__repr__
、__eq__
等方法。
python
Copy code
from dataclasses import dataclass @dataclass class Point: x: int y: int # 使用 p1 = Point(1, 2) p2 = Point(1, 2) print(p1) # 输出: Point(x=1, y=2) print(p1 == p2) # 输出: True
特点:
- 自动生成构造函数和其他方法。
- 提供类型检查支持。
- 可以使用字段默认值和默认工厂。
2. NamedTuple
类似于 tuple
,但带有字段名称,适合表示不可变的数据结构。
python
Copy code
from typing import NamedTuple class Point(NamedTuple): x: int y: int # 使用 p = Point(1, 2) print(p.x) # 输出: 1 print(p.y) # 输出: 2
特点:
- 提供字段名称访问。
- 支持类型注解。
- 不可变数据结构。
3. collections.Counter
用于计数的字典子类。
python
Copy code
from collections import Counter data = ["apple", "banana", "apple", "orange", "banana", "apple"] counter = Counter(data) print(counter) # 输出: Counter({'apple': 3, 'banana': 2, 'orange': 1}) print(counter["apple"]) # 输出: 3
特点:
- 自动统计元素频率。
- 提供方便的操作,如加法、减法等。
4. collections.defaultdict
带有默认值的字典,访问不存在的键时会自动生成默认值。
python
Copy code
from collections import defaultdict # 使用 dd = defaultdict(list) dd["key"].append("value") print(dd) # 输出: defaultdict(<class 'list'>, {'key': ['value']})
特点:
- 避免
KeyError
。 - 自动初始化新键的值。
5. collections.deque
双端队列,用于快速地在两端添加或删除元素。
python
Copy code
from collections import deque dq = deque([1, 2, 3]) dq.append(4) # 在右侧添加 dq.appendleft(0) # 在左侧添加 print(dq) # 输出: deque([0, 1, 2, 3, 4]) dq.pop() # 删除右侧元素 dq.popleft() # 删除左侧元素 print(dq) # 输出: deque([1, 2, 3])
特点:
- O(1) 时间复杂度的插入和删除操作。
- 支持栈和队列操作。
6. itertools
提供了生成器和迭代器相关的高效工具。
python
Copy code
from itertools import combinations, permutations data = [1, 2, 3] # 组合 print(list(combinations(data, 2))) # 输出: [(1, 2), (1, 3), (2, 3)] # 排列 print(list(permutations(data, 2))) # 输出: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
特点:
- 提供无限序列工具(如
count
、cycle
)。 - 支持排列组合、笛卡尔积、分组等。
7. pathlib.Path
用于操作文件和目录的现代化工具。
python
Copy code
from pathlib import Path # 获取当前路径 current = Path(".") print(current.resolve()) # 输出: 当前路径的绝对路径 # 创建目录和文件 path = Path("example_dir/example.txt") path.parent.mkdir(parents=True, exist_ok=True) path.write_text("Hello, World!") # 写入文件 print(path.read_text()) # 输出: Hello, World!
特点:
- 跨平台文件路径操作。
- 语法直观,功能丰富。
8. functools.lru_cache
用于缓存函数结果,提高重复调用时的性能。
python
Copy code
from functools import lru_cache @lru_cache(maxsize=128) def fib(n): if n < 2: return n return fib(n - 1) + fib(n - 2) print(fib(10)) # 输出: 55
特点:
- 自动缓存函数结果。
- 避免重复计算,提升性能。
9. typing
提供了静态类型检查工具,包括 TypedDict
和 Protocol
等。
python
Copy code
from typing import TypedDict class User(TypedDict): name: str age: int # 使用 user: User = {"name": "Alice", "age": 30} print(user["name"]) # 输出: Alice
特点:
- 用于类型注解和静态检查。
- 提高代码的可读性和安全性。
10. abc.ABC
实现抽象基类(Abstract Base Class),用于定义接口或规范。
python
Copy code
from abc import ABC, abstractmethod class Shape(ABC): @abstractmethod def area(self): pass class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14 * self.radius * self.radius circle = Circle(5) print(circle.area()) # 输出: 78.5
特点:
- 定义接口,强制子类实现特定方法。
- 提高代码规范性。