Python 测开28期 - TLF - 学习笔记 - 测试平台开发 - 请求与响应

一、请求方法

常用请求方法有:get、post、put、delete
可以在设置路由的同时,通过 methods 参数设置请求方法(可设置多个,以列表形式呈现,但建议单独请求单独处理)

from flask import Flask

app = Flask(__name__)

# 在设置路由的同时,可以通过 methods 参数设置请求方式,可以设置多个(列表形式),但建议单独设置单独处理
# get 请求
@app.route('/', methods = ['get'])
def get_method():
    return 'Get Method...'

# post 请求
@app.route('/', methods = ['post'])
def post_method():
    return 'Post Method...'

# put 请求
@app.route('/', methods = ['put'])
def put_method():
    return 'Put Method...'

# delete 请求
@app.route('/', methods = ['delete'])
def delete_method():
    return 'Delete Method...'

# tlf:别忘了写,启动入口
if __name__ == '__main__':
    app.run()

可通过postman模拟发送请求

注意:为更突出关键内容,以下代码均只给出关键代码,框架请借鉴上述代码

二、处理请求数据

image
1. get 请求处理,通过 request.args 获取请求参数(返回值为类似于字典形式)

# 处理 get 请求, 通过 request.args 获取请求参数(返回值为类似于字典形式)
@app.route("/",  methods = ['get'])
def get_process():
    info = request.args
    name = info.get('name')
    age = info.get('age')
    print(f"请求信息为:{info},name={name}, age={age}")
    return {"code":0,"msg":"get success"}

运行效果为:
image

控制台输出信息为:

2. post 请求处理,通过 request.json 获取请求信息(一般情况下,请求参数为JSON格式,返回值为字典)

# 处理 post 请求, 通过 request.json 获取请求参数
@app.route("/", methods = ['post'])
def post_process():
    info = request.json
    name = info.get("name")
    age = info.get("age")
    print(f"请求信息为:{info},name = {name}, age = {age} ")
    return {"code": 0, "msg": "post success"}

通过 postman 模拟 post 请求:


控制台输出结信息为:
image

3. 表单请求处理,可以发送 put 或 post 请求,返回信息为字典形式

# 处理 put 请求, 通过 request.form 获取请求参数
@app.route("/", methods = ["put"])
def put_process():
    info = request.form
    name = info.get("name")
    password = info.get("password")
    password_confirm = info.get("password_confirm")
    email = info.get("email")
    print(f"表单信息为:{info}, name = {name}, password = {password}, password_confirm = {password_confirm}, email = {email}")
    return {"code":0, "msg":"put message, 注册信息处理"}

通过 postman 模拟表单信息发送


控制台输出信息为:

4. 文件信息处理,通过 post 请求传递文件信息

  • request.files.get(‘file’) 获取文件对象
  • filename 获取文件对象的文件名
  • save() 方法保存文件到指定路径下
    服务器端代码如下:
# 处理 post 请求,发送的信息为文件
@app.route("/file/", methods = ['post'])
def post_file_process():
    file = request.files.get("file")   # 创建文件对象,保存传入的file信息
    print(f"文件名为:{file.filename}") # 获取文件名称并打印输出
    file.save(r"D:\CCPC1.jpg")         # tlf:注意,此处务必在字符串(路径)前加 r,以防 \ 转义
    return {"code":0, "msg":"file message"}

客户端代码如下:

import requests

# 上传文件到指定网址
def upload_file():
    url = "http://127.0.0.1:5000/file/"
    file = {"file":open(r"D:\CCPC2023.jpg","rb")}   # tlf:注意,此处务必在字符串(路径)前加 r,以防 \ 转义
    r = requests.post(url,files = file)
    print(r.status_code)    # 输出响应码
    print(r.text)   # 输出响应信息

upload_file()  # tlf:注意,别忘了调用函数才能执行哦

注意:模拟处理文件请求时,先将服务器启动,再执行客户端代码

三、设置响应信息

1. 返回类型为文本(text)

# 返回类型为文本
@app.route("/text/")
def post_text():
    return "响应信息为文本类型"  

2. 返回类型为元组(tuple)

返回元组有以下三种写法:

  • (response, status)
  • (response, headers)
  • (response, status, headers)
#返回类型为元组
@app.route("/tuple/")
def post_tuple():
    return "黄淮学院",200,{"name":"tlf"}    # 响应内容含响应体、状态码和响应头,此处使用的第三种写法

运行效果及网络监控信息如下:(注意,需要刷新一下才能看到)

3. 返回类型为 JSON 格式
两种方式:

  • 直接返回 dict,系统会自动转换为 JSON 格式
  • 使用 jsonify() 方法,通过参数传入键值对,从而返回 JSON 格式的信息
# 返回类型为 JSON 格式
@app.route("/json/")
def response_json():
    # 第一种方法:以 字典 形式设定返回数据,系统自动转换为 JSON 格式
    # return {"name":"tlf", "age":18, "sex":"female"}
    # 第二种方法:通过 flask 提供的 jsonify() 方法进行返回,此处参数为 字典 形式
    # return jsonify({"name":"tlf", "age":20, "sex":"female"})
    # 第三种方法:通过 flask 提供的 jsonify() 方法进行返回,此处参数为 key-value 形式,会被转换为 JSON 格式
    return jsonify(name="tlf",age=19,sex="female")

4. 返回类型为 html(了解即可,不建议)

  • 第一步,先在代码文件所在路径下提前设定好模板(新增文件夹 templates → 新建 模板 文件)
    (1)新建 templates 文件夹
    image
    image
    (2)在 templates 文件夹下新建一个文件,用于存储 html 模板文件
    image
    设定模板文件名称:
    image
    (3)设定 html 模板文件的具体内容
    image
  • 第二步,写服务器代码,将指定 html 模板返回
# 返回类型为 html(通过调用 render_template() 方法将提前设置好的 html 模板进行返回)
@app.route("/html/")
def response_html():
    # 返回提前设定好的模板,该模板需要存储在当前包下的 templates 文件夹下(名称必须是templates)
    return render_template("demo.html")

5. 返回其他额外信息
参考第4项内容

# 返回其他额外信息
@app.route("/extra/")
def response_extra():
    extra = make_response(render_template("demo.html"))  # 调用make_response()方法构造响应实例
    extra.set_cookie("name","tlf_hhxy")  # 设置响应信息的cookie
    extra.headers["university"] = "hhxy"  # 设置响应信息的头,注意写法
    return extra

运行效果为:

四、测试平台配置

在测试时,可以对监听的主机(本机 / 局域网 / 外网)、端口进行设置,而启动 Debug 模式后,服务器代码修改后会自动重新加载,无需重启服务器。

  • 监听主机
  • 监听端口
  • Debug模式
if __name__ == '__main__':
    # 设置监听的主机、端口 以及 Debug 模式
    # --------------------------------------------------------
    # 默认 host = "127.0.0.1"(只能本机访问),端口号为5000
    # 当 host = "0.0.0.0",则可以将服务发布到局域网
    # 当 host =" 外网ip",则可以将服务发布到 外网 / 公网
    # --------------------------------------------------------
    # 当端口号被占用或想修改端口号时,可以通过 port = 端口号 进行设定
    # --------------------------------------------------------
    # 系统未上线时,可以打开 Debug 模式便于测试(通过 debug = True 进行设定),此时,服务器代码修改保存后会自动重新加载,无需重启服务
    app.run(host="0.0.0.0",port=5008,debug=True)

五、flask-restx 接口配置

  • flask-restx 简介
    flask-restx 是一个支持 Restful 风格的 flask 插件,用于规范化接口的编写,并且支持 swagger 文档,可读性强 且 可维护性强。
  • restful 风格
    Restful风格:网络应用中资源定位和资源操作的风格。不是标准也不是协议。 Rest是Representational State Transfer的缩写,可译为"表现层状态转化”。Restful风格最大的特点为:资源、统一接口、URI和无状态。 这种风格设计的软件更简洁、更有层次、易于实现缓存等机制。【本段内容出自:https://blog.csdn.net/weixin_56032340/article/details/122587184】
  • 安装
    pip install flask-restx
  • 官方文档
    Welcome to Flask-RESTX’s documentation! — Flask-RESTX 1.1.1.dev documentation
  • 基本使用
from flask import Flask
from flask_restx import Api, Resource

app = Flask(__name__)

# 1、定义 api 实例对象
api = Api(app)

# 2、通过 api 添加 路由
@api.route('/index/')
# 3、定义类,该类需继承自 Resource
class Flask_Demo(Resource):
    # 4、设定 restful 风格的 get 方法
    def get(self):
        return {"require-post":"get"}

    # 设定 restful 风格的 post 方法
    def post(self):
        return {"require-post": "post"}

if __name__ == '__main__':
    app.run(debug=True)

运行效果为:
image
由于未设定 “ / ” 路由,因此,若访问 127.0.0.1:5000 时,运行效果为:
image

未完待续…