fastapi(二)路径参数

本文详细介绍了FastAPI中路径参数的使用方法,包括基本的路径参数声明、类型注释及数据验证,预定义值的使用,以及如何处理路径中包含路径的情况。通过实例展示了如何在函数中声明路径参数的类型,如int、str等,以及如何使用Python的Enum类来声明预定义值。

路径参数

你可以声明一个路径参数或者变量,使用python格式的字符串。

@app.get("/items/{item_id}")
async def read_item(item_id):
...

这个路径参数item_id的值将会传入函数中的变量item_id 中

使用类型的路径参数
你可以在函数中声明路径参数的类型,使用python类型注释。

...
async def read_item(item_id: int):
...

在此,item_id被声明为int类型。

数据转换:会将路径的字符串类型转换为int类型
数据验证:
如果在路径中输入非int字符,将导致error

{
    "detail": [
        {
            "loc": [
                "path",
                "item_id"
            ],
            "msg": "value is not a valid integer",
            "type": "type_error.integer"
        }
    ]
}

Pydantic
所有的数据验证都是基于pydantic实现的。
你也可以使用同样的类型声明在str,float,bool和许多其他负载的数据类型中。
顺序问题
当你创建一个操作路径的时候,这个路径就是固定的。
就像 /users/me,获取当前用户
然后你也可以使用/users/{user_id}去获得某个用户的数据。
但是因为这个路径是绝对顺序的,你必须得确保这个/users/me在/users/{user_id}之前被声明。

from fastapi import FastAPI
app = FastAPI()
@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}

预定义值
如果你想在路径参数中使用预定义值,可以使用标准的python enum。
1、创建enum 类
导入enum 并且创建一个子类继承自str和enum
继承自str是为了api文档能够知道这个值得类型为string。
然后创建类属性为固定值,这些值就是预定义的可用值。
eg:

from enum import Enum
class ModelName(str,Enum):
	alexnet="alexnet"
	resnet="resnet"
	lenet="lenet"

2、声明路径参数
创建一个路径参数并类型注释为你所创建的ModelName

@app.get('/model/{model_name}')
async def get_model(model_name: ModelName):
	if model_name == 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"}

路径参数中包含路径
如果路径使用/files/{file_path}
但是file_path中包含路径,就像:home/johndoe/myfile.txt
所以整个完整得路径就是:/files/home/johndoe/myfile.txt

openapi 中并不支持这种方式,但是在fastapi中可以使用从starlette中来的一个工具,并且docs也能正常的工作

可以这样声明:
/files/{file_path:path}

from fastapi import FastAPI
app = FastAPI()
@app.get("/files/{file_path:path}")
async def read_user_me(file_path: str):
    return {"file_path": file_path}**
<think>好的,我现在要回答用户关于如何在FastAPI中获取请求参数的问题。首先,我需要回忆一下FastAPI的基本用法,特别是处理请求参数的几种方式。记得FastAPI支持路径参数、查询参数、请求体参数等,还有可能涉及表单数据和文件上传。 首先,路径参数。用户可能在URL路径中定义参数,例如/user/{id},这时候在FastAPI中可以通过在路径操作函数的参数中声明来获取。比如定义一个函数def get_user(id: int),这样id就会自动从URL路径中提取并转换为整数类型。需要确认是否正确处理了类型转换和验证,比如如果用户传入非整数字符串,FastAPI自动返回错误响应。 然后是查询参数,也就是URL中的问号后面的参数,比如/item?skip=0&limit=10。在FastAPI中,这些参数会被视为函数参数的默认值,例如def read_item(skip: int = 0, limit: int = 10)。如果用户没有提供这些参数,就会使用默认值。这里需要注意可选参数和必填参数的处理,以及参数类型的校验。 接下来是请求体参数,通常用于POST、PUT等请求,发送JSON数据。在FastAPI中需要用到Pydantic模型来定义数据结构。比如定义一个类Item(BaseModel),然后在路径操作函数中声明参数item: Item,这样FastAPI自动解析请求体中的JSON数据到Item实例。需要说明如何创建Pydantic模型,并处理嵌套结构或复杂类型。 还有表单数据和文件上传的情况。这时候需要使用Form和File来声明参数,同时需要安装python-multipart库。比如处理表单字段username和password,可以使用def login(username: str = Form(...), password: str = Form(...))。文件上传则用File,比如file: UploadFile = File(...)。需要提醒用户安装必要的依赖,并注意处理文件内容。 此外,可能还需要提到请求头参数和cookie参数的获取方式,虽然用户的问题可能主要关注常见的几种参数类型。但为了全面性,可以简要说明如何使用Header和Cookie来获取这些参数。 还需要考虑错误处理,例如参数缺失或类型错误时,FastAPI自动生成相应的错误响应。比如路径参数类型不匹配会返回422状态码,并给出具体的错误信息。这对于开发调试很有帮助。 最后,可能需要给出一个完整的示例,综合几种参数类型,展示如何在一个路径操作函数中同时使用路径参数、查询参数和请求体参数。例如,一个更新用户信息的接口,接收用户ID作为路径参数,分页参数作为查询参数,用户数据作为请求体。这样用户可以看到不同参数类型的使用方式。 另外,参考用户提供的引用内容中,提到了SQLAlchemy的配置和Django处理外部API请求的例子。虽然FastAPI和Django有所不同,但可以借鉴如何将请求参数与数据库操作结合,比如使用获取的参数查询数据库,或者将参数传递给外部API。不过用户的问题主要是关于获取参数,这部分可能暂时不需要深入数据库操作,但可以提到参数如何用于后续处理,比如存储到数据库或调用其他服务。 总结一下,回答的结构应该是先介绍不同类型的参数,然后分别详细说明每种参数的获取方法,包括代码示例,最后可能综合示例和注意事项。需要确保代码示例符合FastAPI的最新实践,语法正确,并且使用中文解释清楚每个步骤。同时,需要检查是否有遗漏的参数类型,或者是否有常见的错误需要提醒用户注意,比如忘记安装python-multipart导致表单处理失败。</think>### 如何在FastAPI中获取请求参数? 在FastAPI中,获取请求参数主要通过以下几种方式实现,具体方法如下: --- #### 1. **路径参数(Path Parameters)** 路径参数直接嵌入在URL路径中,用于标识资源。例如,获取用户ID为`123`的信息: ```python from fastapi import FastAPI app = FastAPI() @app.get("/users/{user_id}") async def get_user(user_id: int): return {"user_id": user_id} ``` - **说明**:`user_id`会从URL路径中提取并自动转换为整数类型。如果传入非整数(如`abc`),FastAPI会返回类型错误[^1]。 --- #### 2. **查询参数(Query Parameters)** 查询参数是URL中`?`后的键值对,例如`/items?skip=0&limit=10`: ```python @app.get("/items/") async def read_items(skip: int = 0, limit: int = 10): return {"skip": skip, "limit": limit} ``` - **说明**:`skip`和`limit`是可选参数,未提供时使用默认值。若需必填参数,可移除默认值。 --- #### 3. **请求体参数(Body Parameters)** 用于接收JSON格式的请求体数据,需结合Pydantic模型: ```python from pydantic import BaseModel class Item(BaseModel): name: str price: float @app.post("/items/") async def create_item(item: Item): return item ``` - **说明**:FastAPI自动将请求体JSON解析为`Item`对象,支持嵌套模型和复杂类型验证[^1]。 --- #### 4. **表单数据(Form Data)** 处理HTML表单提交的数据(如`application/x-www-form-urlencoded`): ```python from fastapi import Form @app.post("/login/") async def login(username: str = Form(...), password: str = Form(...)): return {"username": username} ``` - **注意**:需安装`python-multipart`库,否则会报错。 --- #### 5. **文件上传(File Uploads)** 接收上传的文件: ```python from fastapi import UploadFile, File @app.post("/upload/") async def upload_file(file: UploadFile = File(...)): return {"filename": file.filename} ``` - **说明**:`UploadFile`提供异步文件流操作,适用于大文件上传。 --- #### 6. **请求头参数(Header Parameters)** 从HTTP头部提取参数: ```python from fastapi import Header @app.get("/headers/") async def read_header(user_agent: str | None = Header(default=None)): return {"User-Agent": user_agent} ``` --- #### 7. **Cookie参数(Cookie Parameters)** 获取Cookie中的值: ```python from fastapi import Cookie @app.get("/cookies/") async def read_cookie(session_id: str | None = Cookie(default=None)): return {"session_id": session_id} ``` --- ### 完整示例:综合使用多种参数 ```python @app.put("/users/{user_id}") async def update_user( user_id: int, # 路径参数 item: Item, # 请求体参数 q: str | None = None, # 查询参数 token: str = Header(...) # 请求头参数 ): return {"user_id": user_id, "item": item, "q": q, "token": token} ``` --- ### 注意事项 - **类型校验**:FastAPI自动校验参数类型,若类型不匹配会返回`422 Unprocessable Entity`错误。 - **依赖安装**:处理表单或文件时需安装`python-multipart`。 - **异步支持**:所有操作支持异步(`async`),适合高并发场景[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值