Python restful API入门及本地调试

Python能够轻松实现搭建restful API,本次使用flask模块框架,使用Apipost工具进行调试,我在一个项目中学会如何实现这些,本次也以此为例进行记录。

简介

  • Python RESTful的优点包括:
  1. 简单易用:使用Python编程语言可以轻松地创建RESTful API。
  2. 可扩展性:可以轻松地扩展API功能。
  3. 可读性:使用RESTful API可以提高代码的可读性,因为它们基于资源而不是操作。
  4. 灵活性:RESTful API可以使用各种HTTP方法来执行各种操作。
  • 总之,Python RESTful是一种灵活、简单易用并且可扩展的方式来创建RESTful API。它基于资源而不是操作,可以提高代码的可读性,并且可以使用各种HTTP方法来执行各种操作。

  • 四种请求方法,GET、POST、PUT和DELETE是HTTP协议中常用的四种请求方法,用于客户端与服务器之间进行数据交互。

  1. GET:用于获取资源,请求的数据会附在URL后面作为参数,可以被缓存,不应该用于更新服务器上的数据。例如,当你在浏览器地址栏中输入一个URL时,实际上就是GET请求。
  2. POST:用于向服务器提交数据,请求的数据在请求体中,不会被缓存,可以用于更新服务器上的数据,例如在网站上提交表单。
  3. PUT:用于更新资源,请求的数据在请求体中,如果该资源不存在,则会创建一个新的资源,如果存在,则会被更新。
  4. DELETE:用于删除资源,请求的数据在请求体中,用于删除服务器上的数据。
    总之,GET、POST、PUT和DELETE是用于客户端与服务器之间进行数据交互的四种常用请求方法,每种方法都有特定的用途和语义。

Python程序

  • 数据准备:数据格式如下,invitecode是授权码(邀请码),device是设备,activation是授权码状态(已激活和未激活),name是用户名
invitecode,device,activation,name
kkk,20121322,0,chen
zyh,121380,1,张
77kk,2022,0,刘
php,201322,0,wnag
Leo1442676170,1442676170,0,li
jiang,231214,0,xv
jia,2231214,0,niu
  • 初始化部分:建立datalist存放json数据
import os
import csv
from flask import Flask, jsonify, request

app = Flask(__name__)
datalist = {
    'invitecode': [],
    'device': [],
    'activation': [],
    'name': []
}
path = r"data/{}".format("userlist.csv")
  • 操作函数:写一些操作数据的方法,从上到下依次是获取数据,激活特定授权码,重置特定授权码,删除某个授权码,添加特定授权码
def openCsv():          # 获取data文件夹里面的csv并打开,存入datalist
    global datalist
    invitecodes = []
    devices = []
    activations = []
    names = []
    with open(path, encoding="utf-8", mode="r") as file:
        # 基于打开的文件,创建csv.DictReader实例
        reader = csv.DictReader(file)
        for row in reader:        # 遍历每列
            invitecodes.append(row["invitecode"])
            devices.append(row["device"])
            activations.append(row["activation"])
            names.append(row["name"])
        data={
          "invitecode":invitecodes,
          "device":devices,
          "activation":activations,
          "name":names
          }
        datalist.update(data)

def activateCode(invitecode):          # 激活某个授权码
    in_file = open(path, encoding="utf-8", mode="r")
    reader = csv.reader(in_file)
    out_file = open(path, newline='', encoding="utf-8", mode="r+")
    writer = csv.writer(out_file)
    for row in reader:
        if row[0] == invitecode:  # 如果找到授权码,就把它的activation置1
            row[2] = 1
        writer.writerow(row)
    in_file.close()
    out_file.close()

def resetCode(invitecode):          # 重置某个授权码
    in_file = open(path, encoding="utf-8", mode="r")
    reader = csv.reader(in_file)
    out_file = open(path, newline='', encoding="utf-8", mode="r+")
    writer = csv.writer(out_file)
    if invitecode == "LegendLeo":           # 特殊信号,代表全部置0
        for row in reader:
            if row[0] != "invitecode":        # 排除表头
                row[2] = 0
            writer.writerow(row)
    else:                               # 单点重置
        for row in reader:
            if row[0] == invitecode:  # 如果找到授权码,就把它的activation置0
                row[2] = 0
            writer.writerow(row)
    in_file.close()
    out_file.close()

def deleteCode(invitecode):             # 删除某行授权码
    with open(path, 'r', newline='', encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)         # 创建一个空列表,用于存储数据
        rows = []           # 遍历每一行数据
        for row in reader:
            if row[0] != invitecode:
                rows.append(row)
    # 重新写入csv文件
    with open(path, 'w', newline='', encoding="utf-8") as csvfile:
        writer = csv.writer(csvfile)    # 创建一个csv写入器
        for row in rows:            # 遍历数据列表,写入到csv文件中
            writer.writerow(row)

# 添加一行授权码,row代表插入之后在第几行(不包括表头)
def addCode(row=None, invitecode=None, device=None, activation=None, name=None):
    with open(path, 'r', newline='', encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)
        rows = []  # 创建一个空列表,用于存储数据
        for r in reader:        # 遍历每一行数据
            # 如果当前行是要插入的位置,则先插入新行,再将当前行添加到列表中
            if row is not None and reader.line_num == row + 1:
                rows.append([invitecode, device, activation, name])
            rows.append(r)      # 将当前行添加到列表中
        if row is None:         # 如果插入位置是最后一行,则在末尾添加新行
            rows.append([invitecode, device, activation, name])
    with open(path, 'w', newline='', encoding="utf-8") as csvfile:
        # 创建一个csv写入器
        writer = csv.writer(csvfile)
        # 遍历数据列表,写入到csv文件中
        for r in rows:
            writer.writerow(r)
  • 服务部分:五个服务对应了五个方法,第一个是GET只有发送数据(json)格式,其他都是POST,其中 request.json 代表接收的数据,可以按关键字进行索引,返回值可以携带消息告知请求方结果等
@app.route('/get',methods=['GET'])
# 获取数据
def get_data():
    openCsv()
    return jsonify(datalist)

@app.route('/activate',methods=['POST'])
# 激活授权码
def activate():
    args = request.json
    try:
        goal = args["invitecode"]       # 要激活的授权码
        activateCode(goal)              # 将该授权码激活状态置为1
        return jsonify({"passed": True, "message": "成功", "data": None})
    except:
        return jsonify({"passed": False, "message": "错误", "data": None})

@app.route('/reset',methods=['POST'])
# 重置授权码
def reset():
    args = request.json
    try:
        goal = args["invitecode"]       # 取消激活的授权码
        resetCode(goal)              # 将该授权码激活状态置为0
        return jsonify({"passed": True, "message": "成功", "data": None})
    except:
        return jsonify({"passed": False, "message": "错误", "data": None})

@app.route('/delete',methods=['POST'])
# 删除授权码
def delete():
    args = request.json
    try:
        goal = args["invitecode"]       # 要删除的授权码
        deleteCode(goal)            # 将该授权码删除
        return jsonify({"passed": True, "message": "成功", "data": None})
    except:
        return jsonify({"passed": False, "message": "错误", "data": None})

@app.route('/add',methods=['POST'])
# 添加授权码
def add():
    args = request.json
    try:
        row = args["row"]
        invitecode = args["invitecode"]       # 添加的授权码
        device = args["device"]
        activation = args["activation"]
        name = args["name"]
        # 添加授权码
        addCode(row=row, invitecode=invitecode, device=device, activation=activation, name=name)
        return jsonify({"passed": True, "message": "成功", "data": None})
    except:
        return jsonify({"passed": False, "message": "错误", "data": None})
  • 最后main函数运行api,会有如下信息,记住这个http地址,这就是 api 运行的本地地址:
    运行API
if __name__ == "__main__":
    app.run()
  • 在自己的IDE(Pycharm、VScode之类的)运行上述程序

调试

  • 浏览器搜索ApiPost进入官网直接下载无脑安装。
  • 打开后点击Api调试,新建目录,命名什么的不赘述。
    新建项目
  • 在目录下新建一个接口,右边界面是主操作界面,如下,填入之前提到的http地址,然后跟着输入路径,即代码中@app.route后面的 /get 之类的,这就是具体要测试的某项请求服务,这里先调 /activate ,注意这是 POST 请求,要把地址左边的选项改成 POST。
  • 然后选择 Body 栏,选择 raw 选项,按图中输入请求数据,这就是请求消息 data 中的具体 json 格式数据,invitecode 对应授权码。然后点击发送就收到了下面的响应,显示成功,这个成功也是我们在代码返回值里设置好的
    接口操作
  • 测试成功,我们保存该接口即可
  • 接着新建一个接口调试 get 方法,这是个 GET 请求,记得改选项,然后把路径改成 /get ,Body不重要因为没有用到任何请求方的数据,可有可无。然后调试,得到下图结果,可以下拉得到整个数据,之前内容为 zyh 的授权码被我们激活了,所以第二个是1,也说明 activate 请求测试的成功。
    请求结果
  • 我们可以接着完成其他服务的测试。
  • Copyrights © 2023-2025 LegendLeo Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信