Python Flask 搭建微信小程序后台详解


Posted in Python onMay 06, 2019

前言:

近期需要开发一个打分的微信小程序,涉及到与后台服务器的数据交互,因为业务逻辑相对简单,故选择Python的轻量化web框架Flask来搭建后台程序。因为是初次接触小程序,经过一番摸索和尝试,个人觉得的微信小程序与后台的交互有点像ajax,所以有ajax开发经验的同学开发小程序应该很容易上手,因为本文着重讲解后台程序的搭建,所以,微信小程序的前端开发将一笔带过,有兴趣学习小程序前端语言的同学可移步网易云课堂的一套快速入门课程《轻松玩转微信小程序》。

分三步讲解微信小程序与Python后台交互数据的全过程

小程序向后台服务器提交数据。微信小程序为数据提交开发了一个API,其实是一个js函数,详细介绍可参考官方API文档《微信小程序API文档》。下面贴下我开发的项目的数据提交js代码。

wx.request({
   url: 'https://我的后台服务器网址/score',
   data: {
   acc_nbr:JSON.stringify(acc_nbr),
   grade1: JSON.stringify(grade1), //将数据格式转为JSON
   grade2: JSON.stringify(grade2), //将数据格式转为JSON
   grade3: JSON.stringify(grade3), //将数据格式转为JSON
   txt1:JSON.stringify(txt1),
   txt2:JSON.stringify(txt2),
   txt3:JSON.stringify(txt3)
   },
   method: "POST",
   header: {
   'content-type': 'application/x-www-form-urlencoded',
   'chartset': 'utf-8'
   }

代码参数讲解:
url: 'https://我的后台服务器地址/score',url参数是数据提交的地址,有点像html里表单提交里的action,微信小程序对后台接入的服务器要求很高,需要具备已备案的能够解析的https域名,我的服务器使用的阿里云,网站架构使用的是

Nginx+supervisor+gunicorn+flask经典Python_flask 部署架构,此架构的部署学习可移步我的云笔记flask部署。
data: data参数是要提交的数据,数据需要转换成json格式,使用JSON的stringify函数,可以看到data的数据类型是JavaScript的对象类型,也就是俗称的键值对。

methon:是数据提交的请求方式,默认是post请求方式,后台在处理请求时会判断请求方式。
header:是数据的头文件,需要设置字符类型为utf-8,即'charset':'utf-8',防止传输中文数据时出现乱码。

wx.requset()函数被调用后,会向后台服务器发起数据的post请求,此时小程序会把data里的数据以post形式向url对应的服务器提交,下面讲解第二部分也是本文重点,即后台服务器接受到小程序的请求后,怎么处理并返回信息

后台服务器处理请求并返回信息。后台服务器处理请求是使用的Python-flask的轻量化web框架,对于想学习flask的同学可以移步flask的快速入门课程。下面贴下我开发的项目的后台处理部分的Python-flask代码。 

# coding=utf8
import sys
defaultencoding = 'utf-8'
if sys.getdefaultencoding() != defaultencoding:
 reload(sys)
 sys.setdefaultencoding(defaultencoding)
from flask import Flask,render_template,request,json
from DB import *
app = Flask(__name__)
@app.route('/')
def hello_world():
 return render_template('index.html')
@app.route('/score',methods=['POST'])
def score():
 in_acc_nbr = str(json.loads(request.values.get("acc_nbr")))
 input_grade1=int(json.loads(request.values.get("grade1")))
 input_grade2 = int(json.loads(request.values.get("grade2")))
 input_grade3 = int(json.loads(request.values.get("grade3")))
 input_txt1=str(json.loads(request.values.get("txt1")))
 input_txt2=str(json.loads(request.values.get("txt2")))
 input_txt3=str(json.loads(request.values.get("txt3")))
 score_db=db('mysql数据库ip地址',3306,'数据库用户名','数据库密码','数据库','utf8')
 conn=score_db.connect_db()
 cursor=conn.cursor()
 sql=''' insert into grade (acc_nbr,grade1,grade2,grade3,txt1,txt2,txt3,insert_time) values (%s,%s,%s,%s,'%s','%s','%s',now()) 
 '''%(in_acc_nbr,input_grade1,input_grade2,input_grade3,input_txt1,input_txt2,input_txt3)
 cursor.execute(sql)
 res=cursor.rowcount
 conn.commit()
 cursor.close()
 conn.close()
 if res==1:
  # print res
  res='数据提交成功'
  return json.dumps(res.decode('utf8'))
 else:
  print res
  res='数据提交失败'
  return json.dumps(res.decode('utf8'))
if __name__ == '__main__':
 app.run(debug=True)

 代码详解:

可以看到这是一段很基础的flask的代码。大家应该看到了 @app.route('/score',methods=['POST'])这条语句,这就是flask的路由函数,没错,/score 正是小程序提交请求是url里的score路径,所以这个路由对应的函数正是处理请求的后台程序。methods=['POST'] 说明这个路由只处理POST请求。

in_acc_nbr = str(json.loads(request.values.get("acc_nbr"))),这段语句是获取请求的数据,首先request.values.get()函数是获得request请求里最初的数据。"acc_nbr"是小程序data对象里的键,因为data里的数据是json格式,所以request获取的数据也是json格式,使用flask自带的json.loads 函数获取字符数据。至此,我们已经拿到了小程序提交的数据了。

将json数据转换成字符数据后,就可以进行相关业务逻辑的处理,这里我的代码是将相关数据提交到mysql数据库里。

业务逻辑处理完毕后,需要向小程序返回消息和数据,return json.dumps(res.decode('utf8')) 这段语句是本文的核心。因为小程序接受数据需要json格式,所以我们的返回数据也需要转换成json格式,使用flask自带的json.dumps函数即可将字符类型的数据转换成json格式的数据。

后台程序返回了数据后,第三步就是小程序该怎么接收返回数据并进行相关业务逻辑处理。

小程序接收返回数据。Python-Flask向小程序返回了JSON格式的数据后,小程序的wx.requset()函数里的SUCESS回调函数用来处理返回数据。下面贴下项目中wx.requset()函数中sucess回调函数。

wx.request({
   url: 'https://我的后台服务器网址/score',
   data: {
   acc_nbr:JSON.stringify(acc_nbr),
   grade1: JSON.stringify(grade1), //将数据格式转为JSON
   grade2: JSON.stringify(grade2), //将数据格式转为JSON
   grade3: JSON.stringify(grade3), //将数据格式转为JSON
   txt1:JSON.stringify(txt1),
   txt2:JSON.stringify(txt2),
   txt3:JSON.stringify(txt3)
   },
   method: "POST",
   header: {
   'content-type': 'application/x-www-form-urlencoded',
   'chartset': 'utf-8'
   },
   success: function (res) {
    console.log(res.data);
   wx.showToast({
    title: res.data,//这里打印出登录成功
    icon: 'success',
    duration: 1000
   });
   var acc_nbr = that.data.phoneNum;
   wx.redirectTo({
    url: '../graderesult/graderesult?phoneNum=' + acc_nbr
   })
   }
  })

代码详解:单独拿出sucess回调函数讲解。

success: function (res) {
             console.log(res.data);
            wx.showToast({
              title: res.data,//这里打印出登录成功
              icon: 'success',
              duration: 1000
            });
            var acc_nbr = that.data.phoneNum;
            wx.redirectTo({
              url: '../graderesult/graderesult?phoneNum=' + acc_nbr
            })
          }

res入参存储的数据,即res.data,就是第二步后台返回的数据。可以用console.log(res.data)看下返回的数据是否正确。

我的项目在拿到后台返回的数据,进行了弹窗展示返回数据wx.showToast和页面的跳转wx.redirectTo,大家可以根据自己的业务需求在sucess回调函数编写自己的业务逻辑。

结尾:

至此,微信小程序和Python后台交互数据的步骤已经讲完。正如文章开头所讲,学过ajax的同学读完会发现微信小程序与后台交互数据非常像ajax,所以,文章结尾贴出一个彩蛋,即神奇的ajax代码,出自我的另一个web项目,供大家品鉴^_^~

<script type="text/javascript">
 $(function () {
  $('.btn').click(function () {
   var $result = $('#result');
   var $result1=$('#result1');
   var $acc_nbr = $('input[name="acc_nbr"]').val();
   $.ajax({
     url: '/query',
     data: $('form').serialize(),
     type: 'POST',
     dataType: 'json',
     success: function (data) {
      if (data.length !=0){
       console.log(data.length);
      var str = "";
      var str1="<input value='"+data[0][8]+"'class='form-control' type='hidden' name='acct_id'>" +
       "<input value='"+Math.ceil(data[0][7]*1.5)+"'class=\"form-control\" type=\"text\" name='credit_amount' readonly >" +
       " <button type=\"submit\" class=\"btn btn-primary\">确认</button>";
 
      for (s in data) {
       if (data[s][4] == '后付费') {
        str = str + "<tr class=\"danger\">"
         + "<td>" + data[s][0] + "</td>"
         + "<td>" + data[s][1] + "</td>"
         + "<td>" + data[s][2] + "</td>"
         + "<td>" + data[s][3] + "</td>"
         + "<td>" + data[s][4] + "</td>"
         + "<td>" + data[s][5] + "</td>"
         + "<td>" + data[s][6] + "</td>"
         + "</tr>"
       }
       else {
        str = str + "<tr class=\"success\">"
         + "<td>" + data[s][0] + "</td>"
         + "<td>" + data[s][1] + "</td>"
         + "<td>" + data[s][2] + "</td>"
         + "<td>" + data[s][3] + "</td>"
         + "<td>" + data[s][4] + "</td>"
         + "<td>" + data[s][5] + "</td>"
         + "<td>" + data[s][6] + "</td>"
         + "</tr>"
 
       }
 
      };
      $result1.html(str1);
      $result.html(str);
 
 
     }
     else {
       alert('此号码不在派单内!!');
      }
     }
 
    }
   )
  });
 });
 
</script>

以上所述是小编给大家介绍的Python Flask 搭建微信小程序后台详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python实现探测socket和web服务示例
Mar 28 Python
使用Node.js和Socket.IO扩展Django的实时处理功能
Apr 20 Python
Python实现运行其他程序的四种方式实例分析
Aug 17 Python
python编程实现随机生成多个椭圆实例代码
Jan 03 Python
Python实现快速计算词频功能示例
Jun 25 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
python3.7 sys模块的具体使用
Jul 22 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Python解析微信dat文件的方法
Nov 30 Python
Python玩转PDF的各种骚操作
May 06 #Python
使用Python和Prometheus跟踪天气的使用方法
May 06 #Python
Python中常用的8种字符串操作方法
May 06 #Python
基于python if 判断选择结构的实例详解
May 06 #Python
20行python代码的入门级小游戏的详解
May 05 #Python
python2.7 安装pip的方法步骤(管用)
May 05 #Python
Python中print和return的作用及区别解析
May 05 #Python
You might like
怎样在UNIX系统下安装php3
2006/10/09 PHP
收集的php编写大型网站问题集
2007/03/06 PHP
PHP学习资料汇总与网址
2007/03/16 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
文字不间断滚动(上下左右)实例代码
2013/04/21 Javascript
js打造数组转json函数
2015/01/14 Javascript
多个jQuery版本共存的处理方案
2015/03/17 Javascript
js实现完美兼容各大浏览器的人民币大小写相互转换
2015/10/29 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
Bootstrap基本样式学习笔记之按钮(4)
2016/12/07 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
JS+canvas绘制的动态机械表动画效果
2017/09/12 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
jQuery实现form表单序列化转换为json对象功能示例
2018/05/23 jQuery
js实现图片上传并预览功能
2018/08/06 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
详解python读取和输出到txt
2019/03/29 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
工程监理应届生求职信
2013/11/09 职场文书
工商管理本科生求职信
2014/07/13 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
2014年终个人总结报告
2015/03/09 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
红白喜事主持词
2015/07/06 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
mongodb的安装和开机自启动详细讲解
2021/08/02 MongoDB