接口自动化初步实践(六)之Flask深入

前言

上篇介绍了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

总结

关注公众号了解更多
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值