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

这时,我们使用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. C#进程调用FFmpeg操作音视频

    项目背景 因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂 ...

  2. HTTP2和WebSocket

    HTTP http是目前应用最广泛的应用层协议,截止到目前为止已经发布了多个版本,最常用的是http1.1和http2. http0.9是最早的版本,功能很简单,没有header,只支持GET. ht ...

  3. Go - 如何编写 ProtoBuf 插件 (三) ?

    目录 前言 演示代码 小结 推荐阅读 前言 上篇文章<Go - 如何编写 ProtoBuf 插件 (二) >,分享了基于 自定义选项 定义了 interceptor 插件,然后在 hell ...

  4. leetcode 28. 实现 strStr()

    问题描述 实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不 ...

  5. JS调用堆栈

    调用栈 JavaScript 是一门单线程的语言,这意味着它只有一个调用栈,因此,它同一时间只能做一件事.如果我们运行到一个函数,它就会将其放置到栈顶.当从这个函数返回的时候,就会将这个函数从栈顶弹出 ...

  6. ctfshow萌新 web1-7

    ctfshow萌新 web1 1.手动注入.需要绕过函数inval,要求id不能大于999且id=1000,所以用'1000'字符代替数字1000 2.找到?id=" "处有回显 ...

  7. Cesium中级教程2 - 图层

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium支持从几个标准服务绘制和添加高分辨率图像(地图)图层 ...

  8. 字符串自实现(一)(mystrcpy,mystrcat,mystrcmp)

    char* mystrcpy(char* str_one,const char* str_two) { char* tmp = str_one; while (*str_one++ = *str_tw ...

  9. gin中的路由参数

    package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { router := ...

  10. 什么是Listener监听器

    什么是Listener监听器 1,Listener 监听器它是JavaWeb的三大组件之一.JavaWeb的三大组件:Servlet程序,Filter过滤器,Listener监听器. 2,Listen ...