遗留的问题
- 3、FastAPI
- 4、MySQL8
- 5、SQLModel,和FastAPI框架是同一个作者,两者结合比较好用,但是学习成本较高,使用难度稍大
- 6、Vue3
- 7、Tailwindcss
- 8、Ant Design Vue,UI组件库
- 9、数据同步:有一个API,这个API提供了一些数据,需要在ERP系统中进行展示。
- 10、登录注册需要吗?需要
- 11、第三方平台管理:对接哪些接口平台飞书,钉钉,聚水潭等等
- 12、用户管理
- 13、Docker
- 14、Linux
- 15、Nginx
- 16、项目部署实战
任务:安装postman
下载地址:https://www.postman.com/downloads/
测试我们的第一个接口
接口代码:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=8888)
使用postman进行测试:
路径参数
官方文档:https://fastapi.tiangolo.com/zh/tutorial/path-params/
官方描述
什么是路径参数
路径参数,指的是写在URL网址的路径里面的值,它能够将URL中某个路径的值进行捕获,转换为Python的变量。
比如我们经常要根据ID获取用户信息,可能访问的是:http://127.0.0.1:8888/user/3
,这里的3,可能表示的就是用户的ID,这个ID是动态变化的,可能是1,2,3...
任何ID。我们在程序中想要进行捕获,就是需要使用路径参数。
怎么去定义路径参数
比如 http://127.0.0.1:8888/user/3
这个网址中,我们想要对用户的ID进行捕获,我们就可以定义为 /user/{id}
,这里的 {id}
就会被FastAPI自动转换为一个叫 id
的变量名,在路由方法中,就可以使用这个变量获取到路径中的真实值,也就是 3
。
什么是路由方法?
比如下面的代码:
@app.get("/")
async def root():
return {"message": "Hello World"}
root
就是一个路由方法,专门用来处理 /
这个路由的逻辑,当我们访问 http://127.0.0.1:8888/
的时候,会自动执行这个方法。这种专门用来处理某个特定路由的方法,就叫做路由方法。
什么是路径?
比如在上面的方法中,@app.get("/")
,在这段代码中,括号中的字符串,就表示路径。路径指的是我们域名后面紧跟着的访问地址,比如http://127.0.0.1:8888/
,http://127.0.0.1:8888
叫做域名,在真实的线上环境中,可能会被替换为一个网址,比如http://www.baidu.com
。域名后面紧跟着就是/
,这个斜杆就是访问的地址,也就是路径。
这里的路径是网址中的路径,无论什么系统都是 /
,这点和文件路径不一样。
怎么获取路径变量
比如下面的代码:
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
我们在定义完路径参数@app.get("/items/{item_id}")
之后,紧跟着,一定要在方法的参数中,写一个完全相同的变量名async def read_item(item_id)
,最后,我们在方法体中,就可以把路径参数,当成一个正常的变量名return {"item_id": item_id}
去进行使用了。
案例:根据ID获取用户的信息
首先参考代码:
@app.get("/items/{item_id}")
async def read_item(item_id):
return {"item_id": item_id}
然后,我们改一下路径和变量名:
@app.get("/user/{id}")
async def read_item(id):
return {"id": id}
具体实践:
from fastapi import FastAPI
app = FastAPI()
@app.get("/user/{id}")
async def get_user_by_id(id):
return {"id": id}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=8888)
测试:
简单总结
- 什么是路径参数:写在域名后面的,可以被捕获为变量的特殊路径
- 怎么定义路径参数:先在路径中使用花括号捕获,然后在方法参数中声明一个完全相同的变量
- 什么时候使用路径参数:比如想要根据ID获取用户信息的时候,ID可能是任意变化的,这个时候就可以把ID设置成路径参数
声明路径参数的类型
使用 Python 标准类型注解,声明路径操作函数中路径参数的类型。
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int):
return {"item_id": item_id}
本例把 item_id 的类型声明为 int。
回顾基础数据类型
- int:整数
- str:字符串
- bool:布尔值
- list:列表
- dict:字典
- tuple:元组
- set:集合
- float:浮点数
继续根据ID获取用户信息的案例
ID应该是什么类型?
- int整数类型:这种时候,一般是数据库设置了自增ID
- str字符串类型:这种时候,ID可能是UUID字符串,可能是其他算法生成的字符串
什么是ID?
- id(Identity document),是身份证标识号、账号、唯一编码、专属号码、工业设计、国家简称、法律词汇、通用账户、译码器、软件公司等各类专有词汇的缩写。
- 是一个唯一的表示,全局只能出现一次,不能重复
如何声明路径参数的类型
在方法参数中,read_item(item_id: int)
通过冒号:
拼接参数类型,在参数名称后面跟冒号,冒号后面声明这个参数的具体类型即可。
案例:声明ID为int类型
from fastapi import FastAPI
app = FastAPI()
@app.get("/user/{id}")
async def get_user_by_id(id: int):
return {"id": id}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=8888)
修改之前的结果:
修改之后的结果:
修改之前,是有双引号的,表示是字符串类型。修改之后没有双引号了,表示是整数类型。
数据校验
当我们声明了路径参数类型以后,数据就会被自动校验。
比如我们根据ID获取用户信息,id被声明为int类型,此时如果你传个不能转换为int类型的字符串过去,就会报错。
比如:
查看文档
FastAPI会自动给我们的每个接口生成一个接口文档。
访问 http://127.0.0.1:8000/docs,查看自动生成的 API 文档:
这个接口文档是可以执行的:
文件路径参数
示例代码如下:
from fastapi import FastAPI
app = FastAPI()
@app.get("/files/{file_path:path}")
async def read_file(file_path: str):
return {"file_path": file_path}
注意,声明文件路径作为路径参数,需要遵循特殊的语法:{file_path:path}
,这个时候,会把 /files/
后面的所有内容都捕获,然后转换为路径参数变量。比如我们传递的是/files/a/b/c.txt
,这个时候file_path的值就是a/b/c.txt
。
实践:
from fastapi import FastAPI
app = FastAPI()
@app.get("/user/{avatar:path}")
async def get_user_avatar(avatar: str):
return {"avatar": avatar}
if __name__ == '__main__':
import uvicorn
uvicorn.run(app, host='0.0.0.0', port=8888)
使用postman测试:
总结
- 路径参数
- 怎么捕获文件路径?
{avatar:path}
- 怎么定义路径参数?
/user/{id}
- 什么时候使用路径参数?当我们需要通过路径传递变量值的时候,比如用户ID,比如博客ID
URL 示例
比如CSDN的一个网址:https://blog.csdn.net/qq_37703224/article/details/141724195?spm=1001.2014.3001.5501
- 域名:
https://blog.csdn.net
- 路径参数:
/qq_37703224/article/details/141724195
- 查询参数:
?spm=1001.2014.3001.5501
路径参数:/qq_37703224/article/details/141724195
- 第一个路径很明显就是一个路径参数,用来确定是哪个用户,可以认为是用户名或者用户ID
- 第二个路径表示的类型,article表示文章,这个可能是路径参数,也可能不是
- 第三个路径表示的是详情,detail,这个一般都不是路径参数,也就是不是一个变量
- 第四个路径表示的是文章的ID,这个很明显也是一个路径参数,也就是一个变量