Flask系列分享:路由的实现之 post 请求的使用(二)
1. 了解post方法
POST是HTTP协议定义的一种请求方法,用于向指定资源提交要被处理的数据。与之对应的是GET请求方法,GET方法用于请求获取资源,而POST方法用于提交更新资源或者提交一些需要处理的数据。
POST请求通常在表单中进行,当用户在表单中填写完数据并点击提交按钮时,表单数据将会通过POST请求被发送至服务器,服务器根据数据进行处理,并响应客户端请求。
在POST请求中,请求参数被包含在请求的消息主体内,而不是在URL中进行传递,因此POST请求没有参数长度的限制,而且POST请求是安全的,因为参数不会被暴露在URL中。POST请求通常是通过表单进行提交的,但是也可以使用AJAX等技术进行提交。
2. post 请求
由于 post 可以携带大量的数据和不同类型数据,而 get 请求只能传输单一的字符串类型数据和字符长度限制,所以直接在浏览器访问服务端地址,留浏览器都默认以 get 方式进行请求。这里我是使用 Apifox 来实现 post 请求。
如果想弄明白 post 的在 Flask 中的几种请求实现,可以看看
Flask系列分享:路由的实现之 get 请求的使用(一)-> 2.2 get 无参请求的另外两种实现
下面由于使用方便,都会使用 @app.post 装饰器来实现 post 请求。
2.1 无参请求
import os
from flask import Flask
app = Flask(os.gecwd())
if __name__ == "__main__":
app.run(host="0.0.0.0", prox=9999, debug=True)
@app.post("/")
def index():
return {"msg": "post 请求成功"}
2.2 post 地址栏有参请求
```
在这里设置了下
name: string 类型
age: int 类型
```
@app.post("/add/<string:name>/<int:age>")
def index(name, age):
return {"msg": f"post 请求成功, name: { name }, age: { age }"}
这里解释下,由于页面请求的端口和后端服务端口并不处于同一端口,所以浏览器报跨域问题。这里呢,就借助了 Flask render_template() 函数来渲染 html 内容了,保证页面和后端接口处于同一处。 下面给出 render_template() 实现的代码。
from flask import render_template
```
在 Falsk 中, 将 .html 文件放在根目录下的 templates 目录中,render_template 函数会去
templates 文件夹中寻找 index.html 文件。
```
@app.get("/index"):
def index_html():
return render_template("index.html")
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/axios@1.7.2/dist/axios.min.js"></script>
</head>
<body>
<div>
<div>
<label>
姓名:
<input type="text" id="iptName" value="小明" />
</label>
<br />
<label>
年龄:
<input type="text" id="iptAge" value="18" />
</label>
</div>
<button id="btn">请求数据</button>
<div id="getData"></div>
</div>
<script>
btn.onclick = async () => {
getData.innerHTML = await axios
.post(`/add/${iptName.value}/${iptAge.value}`)
.then(
(res) => res.data.msg,
(err) => err.message
);
};
</script>
</body>
</html>
所以从上面可以看出,当年龄的值无法转为 int 类型时, 服务器就返回 404 报错信息了。
2.3 有参混合请求
@app.post("/add/<string:name>/<int:age>")
def index(name, age):
return {
"地址栏参数": f"name={name}, age={age}",
"请求体参数": f"name={name}, age={age}",
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/axios@1.7.2/dist/axios.min.js"></script>
</head>
<body>
<div>
<div>
<label>
姓名:
<input type="text" id="iptName" value="小明" />
</label>
<br />
<label>
年龄:
<input type="text" id="iptAge" value="18" />
</label>
</div>
<button id="btn">请求数据</button>
<div id="getData"></div>
</div>
<script>
btn.onclick = async () => {
getData.innerHTML = await axios
.post(`/add/${iptName.value}/${iptAge.value}`, {
province: "湖北",
city: "武汉",
})
.then(
(res) => {
return Object.keys(res.data)
.map((key) => `${key}:${res.data[key]}`)
.join("<br/>");
},
(err) => err.message
);
};
</script>
</body>
</html>
可以看出在 Flask post 请求中这样混合传参, Flask 也能很好的处理,并成功响应。
下一章,着重一起学习 Flask post 各类数据类型的上传。
转载自:https://juejin.cn/post/7385132376584339493