路由模块是所有web框架都要提供的功能,FastAPI也不例外,路由模块要解决的问题归纳起来只有一条,那就是解决http 请求和处理函数之间的映射关系,简单的解释就是:当一个请求到来时,路由模块决定用哪个函数来处理它。
对于一个请求,它有两个关键信息:
abs_path 指定请求资源的URI(Uniform Resource Identifier,统一资源定位符),path 不包含域名,ip,端口号,也不包含query,下面是url的一般语法格式
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
用一张图来说明各个部分
method 是请求的方法,http请求的方法一共有9种
最常用的是GET和POST,这是大家最为熟悉的
下面通过一个具体例子来讲解FastAPI的路由模块
from fastapi import FastAPI
app = FastAPI()
@app.get("/get")
def get():
return {"msg": "recv get request"}
@app.post("/post")
def post():
return {"msg": "recv post request"}
在这个例子中,我定义了get和post两个函数,app.get 和 app.post 都是装饰器,被这两个装饰器分别装饰后,get函数只能用来处理path 为 /get 且请求方法是GET的请求,同理,post函数只能用来处理path 为 /post 且请求方法是POST的请求。在Flask框架中,get和psot函数被称之为视图函数,而在FastAPI中,被称之为操作路径函数,其实他们在本质上是一样的。
在浏览器里输入 http://127.0.0.1:8000/get 可以来验证get函数的响应结果,使用下面的代码可以验证post函数处理POST请求的结果
import requests
res = requests.post("http://127.0.0.1:8000/post")
print(res.text)
如果你希望一个函数即可以处理GET请求,也可以处理PSOT请求,则可以这样编写代码
@app.get("/test")
@app.post("/test")
def test_func():
return {"msg": "recv http request"}
app.get 和 app.post 是可以叠加使用的,除了connect方法不支持外,其他八个请求方法FastAPI都支持,当多个装饰器用于一个函数时,你需要在处理请求时对请求方法做区分,如何获得请求的header,在后面的文章会有介绍。
QQ交流群: 211426309