微信小程序云托管数据传输(Python restful)

研究半天,搭建起了小程序和本地 restful 工程的数据链路。restful 是通过 Python 的 flask 模块实现的,服务器是小程序官方的云托管功能,同时可以配合 git(我用的 gitee )仓库实现自动化更新服务。本文在实现链路的同时通过数据文件进行数据传输,没有使用到 MySQL 数据库等其他功能

restful工程

·文件准备

  • 我的工程名是 linedetect ,在自己需要的位置新建一个文件夹作为工程(应该可以是中文名),工程结构如下:

    linedetect:
    ——Dockerfile
    ——app:
    ————-main.py
    ————-data:
    ——————-userlist.csv

  • Dockerfile:没有后缀,名字必须一样,云托管目前只支持有 Dock 的,里面写这两行
FROM tiangolo/uwsgi-nginx-flask:python3.8
COPY ./app /app
  • app文件夹里面有main.py,这是实现 restful 功能的主文件,data文件夹是我自己搞的,存放需要处理的数据(也可以不做,只不过 main 文件的文件操作路径改一改而已),里面存放数据文件,这里以 csv 为例

  • csv 数据准备:第一行是表头,数据由 user、device、activation 三个属性组成

user,device,activation
abc,121380,1
Leo,1442676170,0
jiang,231214,0
Tim,123124,0

·Python代码

  • 导入如下库
import os
import csv
from flask import Flask, jsonify, request
  • 全局变量和方法
app = Flask(__name__)
datalist = {'user': [], 'device': [], 'activation': [],}

def openCsv():          # 获取data文件夹里面的csv并打开,存入datalist
    global datalist
    users = []
    devices = []
    activations = []
    with open(r"data/{}".format("userlist.csv"), mode="r") as file:
        reader = csv.DictReader(file)   # 基于文件,创建csv.DictReader实例
        for row in reader:        # 遍历每列
            users.append(row["user"])
            devices.append(row["device"])
            activations.append(row["activation"])
        data={"user": users, "device": devices, "activation": activations}
        datalist.update(data)

def activateCode(invitecode):          # 激活
    in_file = open(r"data/{}".format("userlist.csv"), mode="r")
    reader = csv.reader(in_file)
    out_file=open(r"data/{}".format("userlist.csv"), newline='', 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()
  • 上面两个本质是文件操作,第一个方法是打开 csv 并获取所有数据存入 datalist,datalist 是 json 格式,三个列表相同索引的元素对应着同一行的三个属性。第二个方法是模拟激活操作,打开 csv 文件修改激活 user 对应的 activation 值并保存。这两个方法分别用来演示小程序的 GET 和 POST 请求
  • 两个服务请求、主函数
@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})
      
if __name__ == "__main__":
    app.run(debug=True,host='0.0.0.0',port=int(os.environ.get('PORT', 80)))
    # app.run() 也可以
  • 第一个请求就对应第一个方法,返回的是 json 格式的 datalist,是 GET 请求。
  • 第二个对应的就是第二个方法,主要进行数据修改操作,request.json 是访问者(小程序、公网)传来的数据(参数),也就是说这是个需要参数的服务请求,args[“invitecode”] 则是传来的 json 数据中叫作 invitercode 的一项。返回值调试时候可以看看。主函数运行app即可

云托管

官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloudrun/src/
进入快速开始,选择 Python 部分就可以跟着做最简单的部署,也可以跟着下面的步骤进行

·创建服务

  1. 新建服务,为自己的服务命名,我的命名还是linedetect
    新建服务
  2. 选择代码,先按图中选择,上传工程文件夹(linedetect)点击发布
    代码选择
  3. 等待部署,两分钟左右,然后在服务列表可以看到服务
    服务列表
  4. 点击服务进入如下,下面是未来更新的历代版本(这是后来的图所以已经有版本)
    服务界面

·云端调试

点击云端调试
云端调试

  • 里面有三种调试,这次就做小程序的,先调试第一个请求:
  1. 选择 GET,右边这个 /get 是路径,就是前面 python 代码里面 @app.route('/get',methods=['GET']) 的 /get 也就是说这个可以随便改,只要所有用到的地方都是这个路径名就行了,也可以是多级路径如 /get/getdata 等。
  2. Header 由于我们就是 json 格式就不改
  3. Body 这步用不上,因为 GET 我们没有传参
  4. 点击调试会得到右边这个结果,就是我们 python 文件处理得到的 csv 里面的数据
  • 再调试第二个请求
  1. 选择 POST,右边的路径改为对应的 /activate
  2. Body代码如下,这代表传参值(json),invitecode 对应 py 代码里面的 args[“invitecode”]
{
  "invitecode":"jiang"
}
  1. 点击调试,得到如下结果,正是我们设置的返回值
    POST调试结果
  2. 再次调试 GET 请求,会发现得到的 jiang 对应的 activation 值变成1了。调试成功
  • 每次调试成功后,点击复制调用代码就可以复制到代码,在小程序可以直接使用,后面会叙述,悬浮可以预览代码

·Gitee仓库链接

这样每次都要手动发布服务很麻烦,所以可以使用流水线功能,首先创建 Gitee 仓库,方法可以网上搜,大致就是在网站上创建完,在 linedetect 文件夹内打开 Git Bash,依次输入仓库配置指令

git config --global user.name "这里填你的Gitee名字"
git config --global user.email "这里填你的Gitee的绑定邮箱"
git init
git remote add origin "这里填gitee仓库的SSH"

然后就能轻松更新:

git add .
git commit -m "这里填你的更新说明,也会同步到云托管的历史版本"
git push origin master
  • 上传完进入云托管的服务列表,点击发布,这次选择绑定 Gitee 仓库,其他一般不用调整,勾选灰度发布,点击发布。
  • 接下来就和以前一样部署两分钟。完成后,此时你配置的代码仓库信息已经保存在「服务设置-流水线」中,你可以前往修改。此后每次发布时,可以直接在 Bash 里面按上面那三步直接更新,云托管这边会自动流水线部署,如下图;也可以直接选择「执行流水线」,总之不需要每次配置仓库信息。
    流水线部署
    测试页面
  • 随即进入测试界面,如上,选白名单就行了,暂时不用别的操作,点灰度上线,下一个界面把灰度流量比例调成百分百,点击结单就行了。
  • 回退版本可以在服务页面内点击回退,就可以选择历史版本回溯

微信小程序端

做一个简单的demo,wxss/wxml略过

  • js代码如下,写在 Page 里面
  onLoad: async function() {
    let that = this
    wx.cloud.init({});      //初始化云托管环境
    const res = await wx.cloud.callContainer({  //从云托管获取数据
      config: {
        env: "xxx",   // 微信云托管环境ID,不能为空,替换自己的
      },
      path: '/get', 
      method: 'GET',
      header: {
        'X-WX-SERVICE': 'linedetect',
      }
    });
    console.log(res.data)
  },
  • 注意我写在onLoad函数,是为了小程序加载就获取数据,wx.cloud.init 初始化是必要的,但是不用填参数
  • async 和 await 成对存在,作用可以上网查。简单来说就是完成async函数里面的await部分,才会执行后面的内容(这里就是consol.log)
  • wx.cloud.callContainer 就是访问我们的云托管服务容器,里面的参数 env 是环境ID在云托管右上角找得到
    环境ID
  • path 就是之前提到的路径,这里 method 用 GET 请求,对应的 /get 路径,header 里面 linedetect 就是服务名
  • 这时候即可编译文件,控制台打印出来数据,GET 调用成功
    GET结果
const res2 = wx.cloud.callContainer({     //从云托管发送请求激活对应邀请码,使得邀请码一次性使用
  config: {
    env: "xxx", // 微信云托管环境ID,不能为空,替换自己的
  },
  path: '/activate', 
  method: 'POST',
  header: {
    'X-WX-SERVICE': 'linedetect',
  },
  data: {
    "invitecode": res.content
  },
});
  • 第二项服务请求调试如上,把 path 和 method 改成对应的,项目名称记得改,data 即传递的数据,内容正是云调试 Body 里面的,这里 res.content 可以是输入框的输入值等需要的输入。这段代码可以封装进一个函数绑定到一个组件上进行触发,比如点一个按钮,弹出输入框,输入的 csv 里面有的 jiang,然后再次发送第一项服务请求,就可以发现 jiang 对应的 activation 变成1。调试完成。
    POST结果

PC端请求

  • 我们可以通过 Python 的 requests 库通过公网获取数据,这样可以在本地轻松地备份云端数据,防止数据损坏或意外修改等。
  • 我们需要找到自己云托管服务的公网访问域名(前提是要开启公网访问)
  • 公网域名
import requests
import json
response = requests.get('这里填入公网访问的域名/get')
print(response.text)  # 打印响应内容

PC请求结果

  • 如上,我们通过 requests 请求获得了响应内容(这个数据和开头创建的不是同一个,只是做一个演示),后面我们可以接着用csv库将json数据转字典后存入文档,按自己的需求任意处理数据。

结语

  • 至此完成了本地 python 的简单 restful 工程上传小程序云托管、小程序访问云托管数据、gitee 仓库绑定轻松更新。
  • 注意:这种方法下,每次更新都要用 GET 请求获取一下当前 csv 文件的数据,因为此时云端的 csv 文件已经和本地的不一样了,要获取后手动更新在本地文件里面,否则上传新的工程后 csv 又会覆盖云端。
  • 在云托管服务设置位置可以将最小实例数改为1,如果是0的话服务器没响应30分钟就会关闭,下次请求就得等服务器开启,需要一两分钟,期间请求都是超时的
  • 数据要更改很容易,只需要按自己的需求编写更多的 POST 请求,甚至能完成空数据文件下仅通过请求就完成一个不需要 MySQL 的低配数据库。这很适合数据量很小的项目,能节约资金成本。同时云托管的费用也比租服务器便宜很多,按量计费可以让小数据项目节约不少。
  • Copyrights © 2023-2025 LegendLeo Chen
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信