作为测试人员,在工作或者学习的过程中,有时会没有可以调用的现成的接口,导致我们的代码没法调试跑通的情况。

这时,我们使用python中的web框架Flask就可以很方便的编写简单的接口,用于调用或调试。在之前的pytest系列文章中,已经使用过Flask编写接口用于代码调试。相比于python的另一个web框架Django,Flask编写接口要方便简单很多。

那么,接下来就告诉大家如何使用Flask编写简单的接口吧。

安装Flask

安装命令:pip install flask

验证是否安装成功或查看版本命令:pip show flask

创建项目

创建文件夹-->Pycharm打开即可,或者直接在Pycharm中新建项目。例如,在桌面新建demo文件夹,Pycharm打开,示例如下:

接下来就可以在demo项目中新建模块编写代码了。

编写接口代码

这里示例编写get、post两种方式的接口,用于模拟请求调用。在编写代码之前需要先进行以下几点说明:

  1. 只是编写简单的模拟接口,所以无需跟数据库有交互,数据可以直接放在代码中以字典或其他格式存储
  2. 返回的数据不能为dict形式,需要序列化为json格式,序列化可以使用json.dumps(),也可以使用flask模块中自带的jsonify

项目中新建模块demo_app.py,编写代码如下:

from flask import Flask, jsonify, request
import re app = Flask(__name__) # 使通过jsonify返回的中文显示正常,否则显示为ASCII码
app.config["JSON_AS_ASCII"] = False # 因为是简单模拟,所以数据就以下面字典形式存储,而不是存储在数据库
user_data = [
{"id": 1, "username": "刘德华", "password": "123456", "telephone": "13838395588"},
{"id": 2, "username": "梅艳芳", "password": "666666", "telephone": "13843895511"},
{"id": 3, "username": "陈百强", "password": "888888", "telephone": "13853895510"}
] @app.route("/users", methods=["GET"])
def get_all_users():
"""
查询所有用户信息
:return:
"""
return jsonify({"code": 1000, "data": user_data, "msg": "查询成功"}) @app.route("/users/<int:user_id>", methods=["GET"])
def get_user(user_id):
"""
查询某个用户信息
:param user_id: 用户id
:return:
"""
if user_id > 0 and user_id <= len(user_data):
return jsonify({"code": 1000, "data": user_data[user_id - 1], "msg": "查询成功"})
return jsonify({"code": 1000, "msg": "用户不存在"}) @app.route("/register", methods=['POST'])
def user_register():
"""
注册用户
:return:
"""
# request.json.get("username")即从发送的json格式的请求参数中获取username的值
username = request.json.get("username").strip() # 用户名
password = request.json.get("password").strip() # 密码
telephone = request.json.get("telephone", "").strip() # 手机号,默认为空串
if username and password and telephone:
if username in ("刘德华", "梅艳芳", "张学友"):
return jsonify({"code": 2001, "msg": "用户名已存在!"})
elif not (len(telephone) == 11 and re.match("^1[3,5,7,8]\d{9}$", telephone)):
return jsonify({"code": 4001, "msg": "手机号格式不正确!"})
else:
return jsonify({"code": 1000, "msg": "注册成功!"})
else:
return jsonify({"code": 2001, "msg": "用户名/密码/手机号不能为空,请检查!"}) @app.route("/login", methods=['POST'])
def user_login():
"""
登录
:return:
"""
username = request.json.get("username")
password = request.json.get("password")
if username and password:
if username == "刘德华" and password == "123456":
return jsonify({"code": 1000, "msg": "登录成功!", "token": "sh34ljjl08s32730dj"})
return jsonify({"code": 4001, "msg": "用户名或密码错误!"})
else:
return jsonify({"code": 2001, "msg": "用户名或密码不能为空!"}) if __name__ == '__main__':
app.run(debug=True)

代码如下:

  1. 以上代码包含4个接口,其中,查询所有用户、查询单个用户接口为GET请求,注册、登录接口为POST请求。
  2. @app.route()中指定接口的路径及请求方式,如@app.route("/login", methods=['POST']),路劲为/login,请求方式为post
  3. app.run()中可不指定服务运行的host及端口,默认为http://127.0.0.1:5000/,此时服务不能被同一局域网的其他机器访问。
  4. 指定host为0.0.0.0,如app.run(host="0.0.0.0", port=8888),端口不做要求,不被占用就行,这样服务就可以被同一局域网的其他机器访问了。
  5. app.run()debug=True的作用是启用Flask项目的调式模式 (修改代码后只需ctrl+s保存即可更新服务),否则每次修改代码之后都需要重新启动服务 (即重新运行代码) 才能生效。

运行模块后,Pycharm中显示如下:

该接口服务启动成功,接口请求地址为http://127.0.0.1:5000/,且已经开启的调试模式,接下来就可以去请求这些接口了。

调用接口

我们可以使用postman或者其他工具请求以上接口,这里使用python代码编写调用上面的接口,示例代码如下:

def demo_login():
'''请求登录接口'''
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/login"
data = {
"username": "刘德华",
"password": "123456"
}
res = requests.post(url=url, headers=headers, json=data).text
print(res) def demo_register():
'''请求注册接口'''
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/register"
data = {
"username": "郭富城",
"password": "12345",
"telephone": "18638385431"
}
res = requests.post(url=url, headers=headers, json=data).text
print(res) def demo_get_user():
'''请求查询接口'''
headers = {"Content-Type": "application/json;charset=utf8"}
url = "http://127.0.0.1:5000/users/3"
res = requests.get(url=url, headers=headers).text
print(res) if __name__ == '__main__':
# demo_login()
# demo_get_user()
demo_register()

执行demo_register()请求注册接口,结果如下:

这里需要注意:

  1. 请求代码中,我们指定了headers = {"Content-Type": "application/json;charset=utf8"},则post请求参数的格式需要是json格式,且在接口代码中需要使用 request.json.get("username") 这种形式去获取请求中对用的值。

  2. 同样,如果不指定headers,则post请求参数不需要要是json格式,直接传dict格式就行,这时接口代码中需要使用 request.values.get("username") 这种形式去获取请求中对用的值。

发送请求后,服务端会显示收到的请求,如下所示:

总结

后续如果遇到需要使用接口调试而又没有现成的接口,那么我们就可以按照上面的思路及说明,使用Flask编写简单的接口用于请求调用或者mock。

当然,代码中的一些细节并没有做更细致的说明,感兴趣的同学可以去查看Flask官方文档。

使用Flask开发简单接口的更多相关文章

  1. 使用Flask开发简单接口(2)--POST请求接口

    今天我们继续学习如何使用Flask开发POST接口:用户注册接口和用户登录接口. request接收参数 当我们在页面发出一个POST请求,请求传到服务器时,需要如何拿到当前请求的数据呢?在Flask ...

  2. 使用Flask开发简单接口(1)--GET请求接口

    前言 很多想学习接口测试的同学,可能在最开始的时候,常常会因没有可以练习的项目而苦恼,毕竟网上可以练习的接口项目不多,有些可能太简单了,有些可能又太复杂了,或者是网上一些免费接口请求次数有限制,最终导 ...

  3. 使用Flask开发简单接口(3)--引入MySQL

    前言 前面的两篇文章中,我们已经学习了通过Flask开发GET和POST请求接口,但一直没有实现操作数据库,那么我们今天的目的,就是学习如何将MySQL数据库运用到当前的接口项目中. 本人环境:Pyt ...

  4. 使用Flask开发简单接口(4)--借助Redis实现token验证

    前言 在之前我们已开发了几个接口,并且可以正常使用,那么今天我们将继续完善一下.我们注意到之前的接口,都是不需要进行任何验证就可以使用的,其实我们可以使用 token ,比如设置在修改或删除用户信息的 ...

  5. 使用Flask开发简单接口(5)--数据加密处理

    前言 在之前开发的接口中,我们设计把用户信息存储到数据库时,没有对数据进行加密处理,为了提高下安全性,我们今天就学习下,如何对用户数据进行加密加盐处理. MD5加密加盐 MD5加密 MD5是常用的一种 ...

  6. 使用Django开发简单接口:文章增删改查

    目录 1.一些准备工作 安装django 创建django项目 创建博客应用(app) 2.models.py 3.django admin 登录 创建超级用户 4.修改urls.py 5.新增文章接 ...

  7. 在线支付接口之PHP支付宝接口开发简单介绍

    php100:92:在线支付接口之PHP支付宝接口开发 支付接口一般是第三方提供的代收款.付款的平台,可以通过支付接口帮助企业或个人利用一切可以使用的支付方式.常见支付平台:支付宝.快钱.云网支付.财 ...

  8. Java开发笔记(五十八)简单接口及其实现

    前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...

  9. flask开发restful api系列(8)-再谈项目结构

    上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...

随机推荐

  1. xxe-lab学习

    0x00 前言 xxe-lab是一个一个包含php,java,python,C#等各种语言版本的XXE漏洞Demo这里附上下载链接https://github.com/c0ny1/xxe-lab我们用 ...

  2. 基于Bert的恶意软件多分类

    基于Bert从Windows API序列做恶意软件的多分类 目录 基于Bert从Windows API序列做恶意软件的多分类 0x00 数据集 0x01 BERT BERT的模型加载 从文本到ids ...

  3. python2.7发送邮件失败之——代码问题

    使用python2.7发送邮件,代码如下: from email.header import Headerfrom email.mime.text import MIMETextimport smtp ...

  4. 数组内sizeof与strlen的区别

    1.数组在内存中是连续存放的,地址呈4个字节递增 2.数组的定义需要初始化,否则输出会已随机值输出 3.strlen()和sizeof()之间无关联:strlen():是求字符串长度的----只能针对 ...

  5. 《剑指offer》面试题36. 二叉搜索树与双向链表

    问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...

  6. 【采坑小计】thanos receiver的官方文档中,并未说明tsdb落盘的配置方式

    官方文档的地址在:https://thanos.io/tip/components/receive.md/ 一开始以为落盘的时间间隔是:--tsdb.retention=15d 实际测试中发现,tha ...

  7. JUC之阻塞队列(BlockingQueue)基础

    阻塞队列 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列.这两个附加的操作支持阻塞的插入和移除方法. 阻塞队列常用于生产者和消费者的场景: 当队列为空的,从队列中获取元素的操作将会 ...

  8. gorm中的高级查询

    智能选择字段 GORM 允许通过 Select 方法选择特定的字段,如果您在应用程序中经常使用此功能,你也可以定义一个较小的结构体,以实现调用 API 时自动选择特定的字段,例如: type User ...

  9. golang中函数的参数

    1. 函数当做函数的参数 package main import "fmt" type HandleFunc func(int) (int, bool) func add10(nu ...

  10. ES_AutoCheck.sh

    #!/bin/bash #@es_check #@date 2019/11/26 #@auth tigergao status=`curl -s GET "http://172.16.71. ...