前言
上篇介绍了flask简单的get请求的访问,以及和requests的结合,本篇介绍在请求中如何将传递的参数返回,以及POST的请求如何实现
一、get传参
拿上篇的request.py来
import requests
parm = {"username":"了不起的QA", "password":"123"}
url = "http://localhost:5000/login"
res = requests.get(url, params=parm).text
print(res)
这里需要思考下,如何将传入的username值传入login接口,然后返回值中带有该传递的参数值呢?
拿上篇的server.py来
from flask import Flask
app = Flask(__name__)
@app.route("/login", methods=["GET"])
def login():
# username = ? 这里我们要思考如何接收username
data = {
"errorCode":200,
"errorMsg":"Success",
"data":{"username":username}
}
return data
if __name__ == "__main__":
app.run()
很显然,在注释行代码里,我们直接像正常的变量赋值操作
username = "了不起的QA"
如果这样,就把代码写死了,我们的需求是,根据我请求参数来动态的返回这个username值,显然这种方法是行不通且愚蠢的
那么,我们能否像方法的传参一样,给他传入一个值呢?
def login(username):
username = username
乍一看像那么回事儿,但是这样也是行不通的。我们的请求访问的是一个路由地址,虽然路由和方法都是命名login,但却不是同一回事儿。我们浏览器访问的地址是路由地址不是方法名。再者,单纯的py脚本,方法的传参在调用的时候传入,那么server.py哪里有直接的调用呢?
所以,需要引入flask第二个知识点
from flask import request
注意:这里的request和requests库有本质区别。命名上也有不同,不要混淆
引包后,注释代码就可以修改为
@app.route("/login", methods=["GET"])
def login():
username = request.args.get("username")
代码里,我们用request.args.get()方法去获取关键字对应的值,这个关键字就是get请求中username。获取的值为”了不起的QA".如果该关键字在请求中没有,那么返回为null。我们尝试运行server脚本,然后执行request脚本看看结果如何
如图,我们的中文好像显示有问题,那么在server脚本中做下修改
import json
data = json.dumps({
"errorCode":200,
"errorMsg":"Success",
"data":{"username":username}
}, ensure_ascii=False)
引入json库,将server中的返回值data用json.dumps()方法序列化,参数ensure_ascii=False。
再次启动server,然后运行request脚本
这样中文就能正常显示了。
至此,flask中get请求基本介绍到此为止,基本可以应付初期的一些接口测试代码的验证。感兴趣可以深入了解flask,这里不再赘述。
server.py完成代码
from flask import Flask
from flask import request
import json
app = Flask(__name__)
@app.route("/login", methods=["GET"])
def login():
# username = ? 这里我们要思考如何接收username
username = request.args.get("username")
data = json.dumps({
"errorCode":200,
"errorMsg":"Success",
"data":{"username":username}
}, ensure_ascii=False)
return data
if __name__ == "__main__":
app.run()
可以自己尝试修改request.args.get()中的关键字,试试返回值是否为null。
二、POST请求
介绍完get请求,我们正式进入POST
还是那个server脚本,我们新增一个POST请求的路由
@app.route("/register", methods=["POST"])
def register():
data = json.dumps({
"errorCode":200,
"errorMsg":"Register Success"
"data":{"username":"了不起的QA", "password":"123"}
}, ensure_ascii=False)
return data
我们先尝试用get的方法,在浏览器中访问这个路由,看看结果如何?
显然,POST的请求方式,用get的方式在浏览器中访问是被拒绝的。”不被允许的方式“
那么要如何才能在浏览器中获得返回值呢?
这里我们需要写一个简单的html。用form表单去提交到这个路由地址。然后才能在浏览器中看到返回值。
form.html
<html>
<body>
<form action="http://127.0.0.1:5000/register" method="POST">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
了解html的朋友应该知道,form标签里 action和method属性值对应的表单提交地址和方式。这里写入我们flask的路由地址,请求方式定为POST
这样一个html文件的显示结果如图,我们点击提交按钮,看看是否能返回正常的数值
浏览器的显示解决了,换成脚本如何呢?
request_post.py
import requests
url = "http://localhost:5000/register"
data = {"username":"了不起的QA", "password":"123"}
res = requests.post(url, data=data).text
print(res)
执行结果如图。
新的问题又来了,我们在get请求方式中,获取过请求参数,那么在post中如何获取呢?
POST方式和GET方式有些微不同,我们在register方法中做下修改
server.py
@app.route("/register", methods=["POST"])
def register():
username = request.form.get("username")
password = request.form.get("password")
data = json.dumps({
"errorCode":200,
"errorMsg":"Register Success"
"data":{"username":username, "password":password}
}, ensure_ascii=False)
return data
注意:这里需要注意两个点
-
POST获取参数值的request.form.get和GET获取参数值的request.args.get是不一样的
-
request.form.get()中的关键字是request_post.py脚本中data内的关键字,需要与之对应,否则获取为null,那么,在html中,与之对应的是两个标签的name属性值。否则获取为null
总结
关注公众号了解更多