FastAPI-5:查询参数Query Parameters


FastAPI-5:查询参数Query Parameters

什么是查询参数?

http://localhost:8080/get?name=xxx&age=18

http://localhost:8080/get?age=18&name=xxx

在url的 ? 后面跟着的一组或多组键值对,就是查询参数

FastAPI的查询参数

  • 当声明了不属于路径参数以外的其他函数参数时,FastAPI会自动解析为查询参数;
  • 和路径参数不同,查询参数可以是可选非必填的,也可以具有默认值。

路径参数 + 请求参数的栗子

from fastapi import FastAPI
import uvicorn
app = FastAPI()
# 路径参数 + 请求参数
@app.get('/items/{item_id}')
async def read_item(
    item_id: str,
    name: str
):
    return {'item_id': item_id, 'name': name}
if __name__ == '__main__':
    uvicorn.run(app='***:app', host='0.0.0.0', port=8080, debug=True)

正确传参的请求结果:

必传参数 + 可选参数的栗子

from typing import Optional
# 必传参数 + 可选参数
@app.get('/items')
async def read_item(
    	item_id: str,
    	name: Optional[str] = None
):
    return {'item_id': item_id, 'name': name}
# 如下:name没有传递参数取的值是None空

不传 name 的请求结果:

查询参数类型自动转换

# 查询参数类型转换
@app.get('/items/{item_id}')
async def read_item(
    	item_id: str,
    	q: Optional[str] = None,
    	short: bool = False
):
    item = {'item_id': item_id}
    if q:
        item.update({'q': q})
    if not short:
        # 如果 short == False,则多加一个键description
        item.update({
            'description': 'This is an amazing item has a long description'
        })
    return item

shortTrue 的请求结果:

shortFalse 的请求结果:

指定枚举类型请求参数的栗子

from enum import Enum
from typing import Optional, List
# 自定义枚举类型
class ModelName(Enum):
    boy = '男'
    girl = '女'
    unknown = '不知道'
@app.get('/item_enum')
async def read_item(
    	name: str,
    	sex: Optional[ModelName] = ModelName.unknown
):
    return {'name': name, 'sex': sex}
# 不传sex,会取sex的默认值:枚举类中的unknown的值

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

不传 sex 的请求结果:

查询参数能用List[str]传参吗?

# List[str]
@app.get('/list')
async def read_item(
	    address:List[str] = None
):
    return {'address': address}

请求结果:

  • 即使参数值写成数组形式也不会传值成功,因为查询参数都是字符串;
  • 所以 ['北京','上海','广州','深圳'] 其实是一个字符串str,并不是List[str],那么怎样才能传数组呢?

分开多次传 address 可以吗?

答案也是否定的

具体怎样做?

用Query库,下篇细说!!!


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