FastAPI中查询参数

文章讲述了FastAPI中如何使用查询参数,如limit=10在获取用户列表的示例,以及路径参数和查询参数的结合使用。还强调了类型提示在参数验证中的作用。

什么是查询参数

简单来说,就是你访问的浏览器的输入的地址的?后面的 键值对。
在FastAPI中,叫做Query Parameters ,指的就是是在HTTP请求中,URL的查询字符串部分传递的参数。这些参数是键值对的形式,通常用于过滤、排序或限制从服务器返回的数据量。

例如,在一个RESTful API中,你可能有一个用于获取用户列表的端点,可以使用查询参数来指定要返回的用户数量:

GET /users?limit=10

在这个例子中,limit 就是一个查询参数,它的值为 10,表示我们希望服务器只返回前10个用户。

在 FastAPI 中,你可以很容易地定义和使用查询参数。FastAPI 使用类型提示(Type hints)来自动处理这些参数。关于Optional和Query,这个在后面会讲到。

代码示例

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/items/")
async def read_items(q: Optional[str] = Query(None, max_length=50)):
    results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
    if q:
        results["q"] = q
    return results

在这个例子中,我们定义了一个名为 read_items 的路径操作,它接受一个可选的 q 参数。这个参数默认为 None,并且最大长度被限制为50个字符。如果客户端提供了 q 参数,那么其值将被添加到响应结果中。

当客户端发送如下请求时:

GET /items?q=Hello

注意点

当我们使用查询参数时,不同于路径参数的是,参数是不需要和我们定义的函数的中的参数的顺序一致的。

服务器会返回类似这样的JSON响应:

{
  "items": [
    {
      "name": "Foo"
    },
    {
      "name": "Bar"
    }
  ],
  "q": "Hello"
}

通过这种方式,你可以轻松地在FastAPI应用中使用查询参数,并且FastAPI的类型检查系统会确保传入的参数符合预期的类型和约束。

路径参数和查询参数的组合

在FastAPI中,路径参数和查询参数可以很容易地一起使用。以下是一个结合了路径参数和查询参数的例子:

from fastapi import FastAPI, Query

app = FastAPI()

@app.get("/users/{user_id}/items/")
async def read_items(user_id: int, q: Optional[str] = Query(None, max_length=50)):
    results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
    if q:
        results["q"] = q
    return {f"User {user_id} items": results}

在这个例子中,我们定义了一个名为 read_items 的路径操作,它接受一个名为 user_id 的路径参数和一个名为 q 的查询参数。

  • user_id: 这是一个整数类型的路径参数,用于指定要获取哪个用户的所有项目。
  • q: 这是一个可选的字符串类型查询参数,默认值为 None,最大长度被限制为50个字符。

当客户端发送如下请求时:

GET /users/42/items?q=Hello

服务器会返回类似这样的JSON响应:

{
  "User 42 items": {
    "items": [
      {
        "name": "Foo"
      },
      {
        "name": "Bar"
      }
    ],
    "q": "Hello"
  }
}

这个例子展示了如何同时使用路径参数(user_id)和查询参数(q),以便根据用户ID过滤项目并添加额外的搜索条件。

注意点

  1. 路径参数必须按照顺序传参,它实际上是一个占位符,已经挖好的坑,对应的 参数就去占坑,站错位置了,就会发生意外。
  2. 实际上,这种组合用法,在我的实际开发项目中,用的并不多,甚至是从来没有使用过!是否选择,看你个人喜好了。

必须参数

当我们在函数中定义了一个参数之后,只写了其类型,或者没有写其类型的时候,都表示这是一个必须填写的值,如果加了默认值,则不是必须的。

代码示例

from fastapi import FastAPI, Query
from typing import Optional

app = FastAPI()


@app.get("/a/")
async def a(q: str):
    results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
    if q:
        results["q"] = q
    return results


@app.get("/b/")
async def b(q: str = Query(...)):
    results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
    if q:
        results["q"] = q
    return results


@app.get("/c/")
async def c(q: Optional[str] = None):
    results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
    if q:
        results["q"] = q
    return results


@app.get("/d/")
async def d(q: Optional[str]):
    results = {"items": [{"name": "Foo"}, {"name": "Bar"}]}
    if q:
        results["q"] = q
    return results

我们分别来解释一下这四个路由函数
您的代码中包含了四个不同的查询参数处理方式。下面是每个方法的解释:

  1. /a/:
@app.get("/a/")
async def a(q: str):

这个路径操作使用了默认的查询参数定义方式,即通过类型提示来指定查询参数 q 的类型为字符串。这意味着客户端在发送请求时必须提供 q 参数,否则会引发一个错误。

  1. /b/:
@app.get("/b/")
async def b(q: str = Query(...)):

这个路径操作使用了FastAPI中的特殊标记 ... 来表示必需的查询参数。这与第一个例子相同,意味着客户端在发送请求时必须提供 q 参数。

  1. /c/:
@app.get("/c/")
async def c(q: Optional[str] = None):

这个路径操作使用了可选的查询参数,其默认值为 None。这意味着客户端可以选择是否提供 q 参数。如果提供了,其值将被添加到响应结果中;如果没有提供,则默认值为 None

  1. /d/:
@app.get("/d/")
async def d(q: Optional[str]):

这个路径操作也使用了可选的查询参数,但没有提供默认值。虽然这与第三个例子类似,但FastAPI的行为会有所不同:在这个例子中,如果客户端没有提供 q 参数,FastAPI将返回一个400错误(Bad Request),而不是使用默认值 None

访问http://localhost:8000/docs来分别看看效果
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

综上所述,您应该根据需求选择合适的查询参数定义方式。如果您希望客户端必须提供某个查询参数,请使用第一种或第二种方法。如果您希望客户端可以自由选择是否提供查询参数,请使用第三种方法,并提供适当的默认值。

查询参数是指将参数附加到URL末尾以进行请求的一种技术,通常用于向Web服务器传递额外的信息,以便服务器可以根据查询参数返回相应的响应 [^4]。例如,在Google搜索中,查询参数用于传递搜索关键字,而在电子商务网站中,查询参数用于传递商品ID和其他参数,以便显示特定的产品页面 [^4]。查询参数由一个“?”字符开始,后跟一系列以“&”字符分隔的“名称=值”对 [^4]。 在FastAPI中,查询参数的作用主要体现在以下几个方面: - **数据筛选**:根据用户传入的查询参数值,筛选出符合特定条件的数据。例如,在一个商品列表API中,可以通过查询参数指定价格范围、商品类别等条件,从而返回符合这些条件的商品列表。 ```python from fastapi import FastAPI app = FastAPI() @app.get("/products/") async def get_products(min_price: float = 0, max_price: float = float('inf')): # 假设这是从数据库中获取商品数据的操作 products = [ {"name": "Product A", "price": 10.0}, {"name": "Product B", "price": 20.0}, {"name": "Product C", "price": 30.0} ] filtered_products = [p for p in products if min_price <= p["price"] <= max_price] return filtered_products ``` - **数据分页**:通过查询参数指定页码和每页显示的记录数,实现数据的分页展示。这对于处理大量数据时非常有用,可以避免一次性返回过多数据,提高响应速度和用户体验。 ```python from fastapi import FastAPI app = FastAPI() @app.get("/items/") async def get_items(page: int = 1, limit: int = 10): start_index = (page - 1) * limit end_index = start_index + limit # 假设这是从数据库中获取商品数据的操作 items = [{"id": i, "name": f"Item {i}"} for i in range(1, 101)] paginated_items = items[start_index:end_index] return paginated_items ``` - **搜索功能**:允许用户输入关键字作为查询参数,在数据中进行搜索匹配。例如,在一个博客文章API中,用户可以通过查询参数输入关键词,返回标题或内容中包含该关键词的文章列表。 ```python from fastapi import FastAPI app = FastAPI() @app.get("/articles/") async def search_articles(query: str = ""): # 假设这是从数据库中获取文章数据的操作 articles = [ {"id": 1, "title": "FastAPI Introduction", "content": "Learn about FastAPI."}, {"id": 2, "title": "Python Programming", "content": "Python is a great language."} ] search_results = [a for a in articles if query.lower() in a["title"].lower() or query.lower() in a["content"].lower()] return search_results ``` - **个性化配置**:根据不同的查询参数值,为用户提供个性化的服务或配置。例如,在一个天气API中,可以通过查询参数指定温度单位(摄氏度或华氏度),返回相应单位的天气数据。 ```python from fastapi import FastAPI app = FastAPI() @app.get("/weather/") async def get_weather(unit: str = "celsius"): temperature = 25 if unit.lower() == "fahrenheit": temperature = (temperature * 9/5) + 32 return {"temperature": temperature, "unit": unit} ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

micro_cloud_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值