FastAPI: 请求路径参数(2)

路径参数(/users/{id})在项目中 不可避免的,如下:

基本操作

1
2
3
@app.get('/users/{id}')
def root(id: int): # 声明参数类型
return {'user_id': id}

id被声明为int类型,如果调用的时候不是int型,会报错。

1
2
3
4
5
6
http://127.0.0.1:8000/users/123
{"user_id":123}

# 数据校验
http://127.0.0.1:8000/users/a
"detail":[{"loc":["path","id"],"msg":"value is not a valid integer","type":"type_error.integer"}]}

注意函数接收(并返回)的值为 123,是一个 int 值,而不是字符串 "123"。FastAPI通过类型声明自动对请求进行转换。

路径查找顺序

路径操作是按顺序依次运行的,所以下面的代码就会有问题

1
2
3
4
5
6
7
@app.get('/users/{id}')
def root(id: int):
return {'user_id': id}

@app.get('/users/zhangsan')
def root():
return {'name': 'zhangsan'}

调用http://127.0.0.1:8000/users/zhangsan时,至上而下执行,/users/{id}会与 /users/zhangsan 相匹配,认为把zhangsan传给了 user_id

一定要确保路径的顺序的正确性。

预设参数

有时候想给参数设定一个有效的范围,FastAPI也是支持的。可以使用枚举来设定有效参数值。

1
2
3
4
5
6
7
8
9
10
class UserName(str, Enum):
n1 = 'zhangsan'
n2 = 'lisi'

@app.get('/users/{name}')
def root(name: UserName):
if name == UserName.n1:
return {'name': name}
if name.value == 'lisi':
return {'name': name}

只能传设定好的参数。

1
2
3
4
5
http://127.0.0.1:8000/users/zhangsan
{"name":"zhangsan"}

http://127.0.0.1:8000/users/wangwu
{"detail":[{"loc":["path","name"],"msg":"value is not a valid enumeration member; permitted: 'zhangsan', 'lisi'","type":"type_error.enum","ctx":{"enum_values":["zhangsan","lisi"]}}]}
唐胡璐 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
分享创造价值,您的支持将鼓励我继续前行!