3.FastAPI参数

3.FastAPI参数

3.1路径参数(Path参数)

路径参数就是在请求路径中携带的参数。

3.1.1路径参数的声明

在请求路径中使用花括号标识参数,在对应的Python函数中使用函数参数接受参数值。

示例:

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/language/{language_id}')
async def find_language(language_id):    
    languages = {        
        1: 'Python',        
        2: 'C',        
        3: 'C++',        
        4: 'Java',        
        5: 'C#',        
        6: 'Go',        
        7: 'Rust',        
        8: 'Julia',        
        9: 'R'    
    }    
    return {'lang': languages[int(language_id)]}

上面的示例中,路径中的{language_id}声明了一个路径参数language_id,对应的函数find_language(language_id)中通过定义同名的函数参数来接受数据值,但此处未对参数类型进行定义,所以在返回数据时采用int(language_id)对数据值进行了类型转换。

执行请求:

curl http://127.0.0.1:8000/language/9
{"lang":"R"}

3.1.2路径参数类型

路径参数的类型使用标准的Python类型在函数中声明,代码如下:

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/language/{language_id}')
async def find_language(language_id: int):    
    languages = {        
        1: 'Python',        
        2: 'C',        
        3: 'C++',        
        4: 'Java',        
        5: 'C#',        
        6: 'Go',        
        7: 'Rust',        
        8: 'Julia',        
        9: 'R'    
    }    
    return {'lang': languages[language_id]}

在上面的代码中函数参数language_id被声明为int类型。

设置参数类型的好处:

  • 可以提供编辑器支持,如:错误检查、完整性检查等

  • 可以自动转换路径参数类型,如在上面的请求中,如果language_id不声明int类型,则按照字符串进行处理,声明为int类型后,则可自动转换为int类型。

  • 另外,还可以提供数据类型的校验,如当执行如下请求时会返回:

curl http://127.0.0.1:8000/language/python
{
    "detail":[
        {
            "loc":["path","language_id"],
            "msg":"value is not a valid integer",
            "type":"type_error.integer"
        }
    ]
}

从以上返回的信息中可以看到:路径参数language_id出现了整型类型错误。

3.1.3路径参数顺序

在设计系统URL路径时,有时会出现一些固定的路径与路径参数冲突的情况,比如:/language/10是一个固定路径,我们设计该路径返回{‘lang’: 'Fortran'}这样一个固定的数据,这样就引起了路径冲突。

由于路径操作时按照顺序来评估的,所以要确保/language/10在/language/{language_id}之前进行声明。代码如下:

  • /language/10在/language/{language_id}之后声明

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/language/{language_id}')
async def find_language(language_id: int):    
    languages = {        
        1: 'Python',        
        2: 'C',        
        3: 'C++',        
        4: 'Java',        
        5: 'C#',        
        6: 'Go',        
        7: 'Rust',        
        8: 'Julia',        
        9: 'R'    
    }    
    return {'lang': languages[language_id]}
@app.get(path='/language/10')
async def find_language():    
    return {'lang': 'Fortran'}

执行请求:

curl http://127.0.0.1:8000/language/10
Internal Server Error

可见,没有匹配到正确的url上,所以出现错误。

  • /language/10在/language/{language_id}之前声明

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/language/10')
async def find_language():    
    return {'lang': 'Fortran'}
​
@app.get(path='/language/{language_id}')
async def find_language(language_id: int):    
    languages = {        
        1: 'Python',        
        2: 'C',        
        3: 'C++',        
        4: 'Java',        
        5: 'C#',        
        6: 'Go',        
        7: 'Rust',        
        8: 'Julia',        
        9: 'R'    
    }    
    return {'lang': languages[language_id]}

执行请求:

curl http://127.0.0.1:8000/language/10
{"lang":"Fortran"}

3.2查询参数(Query参数)

查询参数是在URL中"?"之后的键值对,每对键值对用"&"分开。在函数声明时,当声明不属于路径参数的其他参数时,FastAPI会将其解释为查询参数。

3.2.1声明查询参数

from fastapi import FastAPI
app = FastAPI()
@app.get(path='/add')
async def find_language(vara: int = 0, varb: int = 0):    
    return {'added': vara + varb}

执行请求:

curl http://127.0.0.1:8000/add?"vara=2&varb=3"
{"added":5}

在上面的代码中,函数声明的参数vara和varb由于在路径中均没有声明,所以FastAPI会解析成查询参数;同时在代码中还为参数定义了默认值,那么当请求http://127.0.0.1:8000/add时,执行结果:

curl http://127.0.0.1:8000/add
{"added":0}
curl http://127.0.0.1:8000/add?varb=9
{"added":9}
curl http://127.0.0.1:8000/add?vara=8
{"added":8}

3.2.2布尔类型的查询参数

当查询参数被声明为bool类型时,传入的参数会被转换,代码如下:

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/boolean')
async def find_language(ok: bool = False):    
    if ok:        
        return {'msg': 'Your answer is yes'}    
    else:        
        return {'msg': 'Your answer is no'}

执行请求:

curl http://127.0.0.1:8000/boolean?ok=1
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=0
{"msg":"Your answer is no"}
curl http://127.0.0.1:8000/boolean?ok=True
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=true
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=False
{"msg":"Your answer is no"}
curl http://127.0.0.1:8000/boolean?ok=false
{"msg":"Your answer is no"}
curl http://127.0.0.1:8000/boolean?ok=Yes
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=yes
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=No
{"msg":"Your answer is no"}
curl http://127.0.0.1:8000/boolean?ok=no
{"msg":"Your answer is no"}
curl http://127.0.0.1:8000/boolean?ok=on
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=On
{"msg":"Your answer is yes"}
curl http://127.0.0.1:8000/boolean?ok=Off
{"msg":"Your answer is no"}
curl http://127.0.0.1:8000/boolean?ok=off
{"msg":"Your answer is no"}

3.2.3同时使用路径参数和查询参数

可以同时声明多个路径参数和查询参数,FastAPI按参数名区分参数,与声明顺序无关。

示例代码:

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/add/{vara}/{varb}')
async def add(vara: int, varb: int, x: int, y: int):
    return {'added': vara + varb, 'multiply': x * y}
​
​
@app.get(path='/multiply/{vara}/{varb}')
async def multiply(x: int, y: int, vara: int, varb: int):
    return {'added': vara + varb, 'multiply': x * y}

执行请求:

curl http://127.0.0.1:8000/add/2/3?"x=5&y=6"
{"added":5,"multiply":30}
curl http://127.0.0.1:8000/multiply/2/3?"x=5&y=6"
{"added":5,"multiply":30}
C:\Users\Administrator>

3.2.4必须的查询参数

声明查询参数时,如果参数未定义默认值,则该参数就是必须的查询参数。代码如下:

from fastapi import FastAPI
​
app = FastAPI()
​
@app.get(path='/add/{vara}/{varb}')
async def add(vara: int, varb: int, x: int, y: int = 1):
    return {'added': vara + varb, 'multiply': x * y}

以上代码中,参数x未声明默认值,当执行如下请求时,会出现错误提示:

curl http://127.0.0.1:8000/add/2/3
{
    "detail":[
        {
            "loc":["query","x"],
            "msg":"field required",
            "type":"value_error.missing"
        }
    ]
}

错误提示x为必须的查询参数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Janeb1018

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

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

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

打赏作者

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

抵扣说明:

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

余额充值