FastAPI-url参数: 路径参数

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)]

特点:

  • 提供无限序列工具(如 countcycle)。
  • 支持排列组合、笛卡尔积、分组等。

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

提供了静态类型检查工具,包括 TypedDictProtocol 等。

 

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

特点:

  • 定义接口,强制子类实现特定方法。
  • 提高代码规范性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值