FastAPI-4:路径参数Path Parameters


FastAPI-4:路径参数Path Parameters

什么是路径

路径参数

就是将路径上的某一部分变成参数,可通过请求传递,然后 FastAPI 解析。

最简单的栗子

import uvicorn
from fastapi import FastAPI
app = fastAPI()
# 路径参数 item_id
@app.get('/items/{item_id}')
async def read_item(item_id):
    return {'item_id': item_id}

if __name__ == '__main__':
    uvicorn.run(app='')

请求结果:

限定类型的路径参数

# 指定类型的路径参数
@app.get('/items/{item_id}/article/{num}')
async def path_test(
    	item_id: str,
    	num: int
):
    return {"item_id": item_id, 'num': num}
# 多个路径参数,且有指定类型

正确传参的请求结果:

num不传int的结果:

Swagger接口文档的显示效果

路径函数顺序问题

@app.get('/users/me')
async def read_user_me():
    return {'user_id': 'the current user'}

@app.get('/users/{user_id}')
async def read_user(user_id: str):
    return {'user_id': user_id}
# /users/{user_id} 路径是包含 /users/me 的
# 当想匹配到固定路径时,需要将固定路径函数放在路径参数函前面

请求结果:

将两个函数顺序调换过来

@app.get('/users/{user_id}')
async def read_user(user_id: str):
    return {'user_id': user_id}

@app.get('/users/me')
async def read_user_me():
    return {'user_id': 'the current user'}
# 这样就无法匹配到固定路径 /users/me 函数了

请求结果:

数据转换器

前言

  • 当你有一个路径是 /files/{file_path} ,但是不确定 file_path 到底会取什么值,并不是固定的长度,可能是 /files/home/johndoe/myfile.txt 也可能是 /files/test/myfile.txt ,那怎么办呢?
  • 路径转换器来啦!

实际栗子

@app.get('/files/{file_path:path}')
async def read_file(file_path: str):
    return {'file_path': file_path}

请求结果:

枚举类型的路径参数

# 导入枚举类型
from enum import Enum
# 自定义枚举类
class ModelName(Enum):
    polo = 'polo'
    yy = 'yy'
    test = 'test'
    
@app.get('model/{model_name}')
# 类型限定为枚举类
async def get_model(model_name: ModelName):
    # 取枚举值方式一
    if model_name == ModelName.polo:
        return {'model_name': model_name, 'message': 'Oh!!!polo!!!'}
    # 取枚举方式二
    if model_name.value == 'yy':
        return {'model_name': model_name, 'message': 'God!!!yy!!!'}
    return {'model_name': model_name, 'message': '巴啦啦能量!!!'}
# 错误提示传的参数值并不是枚举类型中的值

参数传枚举值请求结果:

polo:

yy:

test:

参数传入非枚举值的请求结果:

重点:

路径参数可以不传吗?答案:不可以!路径参数是必传参数。

实际栗子:

总结:

路径参数是请求路径的一部分,如果不传,请求的是另一个路径,如果不存在就会404


文章作者: 刘宇亭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘宇亭 !
评论
  目录