Flask与FastAPi
FastAPI安装与使用
交互式文档
路径与查询参数
参数使用枚举
请求与响应
自定义响应状态码
中间件_计算回调时间
类型与模型
Flask安装与使用
Gunicorn(WSGI服务)
本文档使用MrDoc发布
返回首页
-
+
路径与查询参数
2021年8月18日 10:33
admin
#示例(重要) https://www.cnblogs.com/traditional/p/14733610.html ####构建API时,通常使用这些特定的HTTP方法来执行特定的操作。 ####POST: 创建数据. @app.post() ####GET: 读取数据. @app.get() ####PUT: 更新数据. @app.put() ####DELETE: 删除数据. @app.delete() --- #路由顺序 ####我们在定义路由的时候需要注意一下顺序,举个栗子: # -*- coding:utf-8 -*- # @Author: komeiji satori from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/users/me") async def read_user_me(): return {"user_id": "the current user"} @app.get("/users/{user_id}") async def read_user(user_id: int): return {"user_id": user_id} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=5555) ####注意:路径操作是按照顺序进行的 #####要保证 /users/me 在 /users/{user_id} 的前面,否则的话只会匹配到 /users/{user_id},此时如果访问 /users/me,那么会返回一个解析错误,因为字符串 "me" 无法解析成整型。 --- #路径中包含 / ####假设我们有这样一个路由:/files/{file_path},而用户传递的 file_path 中显然是可以带 / 的,假设 file_path 是 /root/test.py,那么路由就变成了 /files//root/test.py,显然这是有问题的。 ####那么为了防止解析出错,我们需要做一个类似于 Flask 中的操作: from fastapi import FastAPI import uvicorn app = FastAPI() # 声明 file_path 的类型为 path,这样它会被当成一个整体 @app.get("/files/{file_path:path}") async def get_file(file_path: str): return {"file_path": file_path} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=5555) ####访问一下 ![](/media//202108/2021-08-25105109882268.png) --- #查询参数 ####查询参数在 FastAPI 中依旧可以通过类型注解的方式进行声明,如果函数中定义了不属于路径参数的参数时,那么它们将会被自动解释会查询参数。 # -*- coding:utf-8 -*- # @Author: komeiji satori from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/user/{user_id}") async def get_user(user_id: str, name: str, age: int): """我们在函数中参数定义了 user_id、name、age 三个参数 显然 user_id 和 路径参数中的 user_id 对应,然后 name 和 age 会被解释成查询参数 这三个参数的顺序没有要求,但是一般都是路径参数在前,查询参数在后 """ return {"user_id": user_id, "name": name, "age": age} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=5555) ####注意:name 和 age 是没有默认值的,这意味着它们是必须要传递的,否则报错。 ![](/media//202108/2021-08-25110056153484.png) ####我们看到当不传递 name 和 age 的时候,会直接提示你相关的错误信息。如果我们希望用户可以不传递的话,那么必须要指定一个默认值。 # -*- coding:utf-8 -*- # @Author: komeiji satori from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/user/{user_id}") async def get_user(user_id: str, name: str = "UNKNOWN", age: int = 0): return {"user_id": user_id, "name": name, "age": age} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=5555) ![](/media//202108/2021-08-25110138803716.png) ####对于查询参数,由于它们指定了类型,所以我们也要传递正确类型的数据。假设这里的 age 传递了一个 "abc",那么也是通不过的。 ####如果默认值和类型不相同怎么办? # -*- coding:utf-8 -*- # @Author: komeiji satori from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/user/{user_id}") async def get_user(user_id: str, name: str = "UNKNOWN", age: int = "哈哈哈"): return {"user_id": user_id, "name": name, "age": age} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=5555) ####这里的 age 需要接收一个整型,但是默认值却是一个字符串,那么此时会有什么情况发生呢?我们来试一下: ![](/media//202108/2021-08-25110416337835.png) ####我们看到,传递的 age 依旧需要整型,只不过在不传的时候会使用字符串类型的默认值,所以类型和默认值类型不同的时候也是可以的,只不过这么做显然是不合理的。但是问题来了,我们可不可以指定多个类型呢?比如 user_id 按照整型解析、解析不成功退化为字符串。 # -*- coding:utf-8 -*- # @Author: komeiji satori from typing import Union, Optional from fastapi import FastAPI import uvicorn app = FastAPI() @app.get("/user/{user_id}") async def get_user(user_id: Union[int, str], name: Optional[str] = None): """通过 Union 来声明一个混合类型,int 在前、str 在后。会先按照 int 解析,解析失败再变成 str 然后是 name,它表示字符串类型、但默认值为 None(不是字符串),那么应该声明为 Optional[str]""" return {"user_id": user_id, "name": name} if __name__ == "__main__": uvicorn.run("main:app", host="0.0.0.0", port=5555) ![](/media//202108/2021-08-25110505605193.png) ####通过 Python 的类型注解来实现参数类型的限定可以说是非常巧妙的,因此这也需要我们熟练掌握 Python 的类型注解 ---
分享到: