FastAPI-url参数: 查询参数

1. 什么是查询参数

在路径参数中提到了,url中用斜杠分隔开的参数是路径参数。

那么什么是查询参数呢?就是 '?xxx=xxx' 这样问号开头一个变量等于某个值的参数,称为查询参数。

比如我在写这篇文章时的url如下图所示,那么这里的'/mp_blog/creation/editor'就是查询参数, '?spm=12467984654' (随便打的数字) 就是路径参数。

声明不属于路径参数的其他函数参数时,它们将被自动解释为"查询字符串"参数

查询字符串是键值对的集合,这些键值对位于 URL 的 ? 之后,并以 & 符号分隔。

2. 如何使用查询参数

ok,知道路径参数是什么了。下面介绍一下路径参数的几种使用方式。分别是

  • 默认查询参数
  • 必须查询参数
  • 可选查询参数
  • 多个路径和查询参数

默认查询参数

import uvicorn
from fastapi import FastAPI
import asyncio

app = FastAPI()

fake_items_db = [{"item_name":"Foo"}, {"item_name": "Bar"}, {"item_name": "NiuBee"}, {"item_name": "NiuBee"}, {"item_name": "NiuBee"}]

@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10): # 默认 skip=0, limit=10
    return fake_items_db[skip : skip + limit] # 参数若为默认值, 返回list从0 到 10范围的元素

if __name__ == '__main__':
    config = uvicorn.Config(app, host='127.0.0.1', port=8000)
    server = uvicorn.Server(config)
    asyncio.run(server.serve())

必须查询参数

必须查询参数指在参数列表中不写默认值。如果希望这个参数是可选的,默认值设为None

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/items/{item_id}")
async def read_user_item(item_id: str, needy: str):
    item = {"item_id": item_id, "needy": needy}
    return item

浏览器输入 http://127.0.0.1:8000/items/4?needy=yes, 返回 {"item_id":"4","needy":"yes"}

可选查询参数

默认值为None的参数

import uvicorn
from typing import Union
from fastapi import FastAPI

app = FastAPI()

@app.get("/items/{item_id}")
async def read_item(item_id: str, q: Union[str, None] = None): # q的str与None占同一个空间
    if q:
        return {"item_id": item_id, "q": q}
    return {"item_id": item_id}

浏览器输入 http://127.0.0.1:8000/items/4

会看到 {"item_id":"4"}

输入 http://127.0.0.1:8000/items/4?q=hello

会看到 {"item_id":"4","q":"hello"}

多个路径和查询参数

参数列表中可以有多个路径参数和查询参数,并且不用关注他们的顺序,FastAPI能够通过名称识别他们。

import uvicorn
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("/users/{user_id}/items/{item_id}")
async def read_user_item(
    user_id: int, item_id: str, q: Union[str, None] = None, short: bool = False
):
    item = {"item_id": item_id, "owner_id": user_id}
    if q:
        item.update({"q": q})
    if not short:
        item.update(
            {"description": "This is an amazing item that has a long description"}
        )
    return item

浏览器输入 http://127.0.0.1:8000/users/3/items/4?q=foo&short=yes

会看到 {"item_id":"4","owner_id":3,"q":"foo"}

浏览器输入 http://127.0.0.1:8000/users/3/items/4?q=foo

会看到 {"item_id":"4","owner_id":3,"q":"foo","description":"This is an amazing item that has a long description"}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值