微信小程序 后端用Flask实现
手上有个微信小程序项目,因为对Python相对熟悉一些,打算后端用python写,具体采用python 轻量级的flask框架。
在做的过程中,有些问题需要考虑,记录在下边.
1. 开发的小程序后端怎么区分不同的小程序用户?
或者说有哪些属性可以唯一的标识一个用户呢?首先想到的是 微信号,手机号,微信号好像现在还没有API可以获取,手机号又比较麻烦还涉及到读取用户信息,进一步的做法是用openid, unionid, 比如让用户每次请求都带上openid, 然后在后台看是否有这个Openid 信息,这是一种方法,这样做相当于把openid 当做web开发里常用的session id 来使用了,区分用户的作用是起到了,但是用一个一成不变的openid 来识别用户是有安全风险的,万一泄露了别人也可以伪装成你来像后台发请求. 既然提到了session id, 那么更好的方案应该是在后台维护 自定义登录态的session[1] 和 openid 的Map表,前后端的用户唯一标识用session id,当识别到是一个的用户的 session 就根据map表找到openid, 再做进一步的操作.
我的小程序在开始阶段就是用 openid放在payload里来识别用户. 有没有更更好的方案呢?应该上token机制,OAuth或者JWT走起,就更加安全了. 我最终选用的方案是 我的flask 学习笔记 里的第7条用到的token方案,简单好用!
2. 小程序怎么同步调用?
看到微信小程序的API 都是异步调用的,比如 app.onLauch 和 page.onLoad, 虽然app.onLauch 先与page.onLoad调用,但是很可能onLoad 执行完成以后onLauch才完成。但是有些时候我们再onLoad里又依赖于onLoad 执行的结果,这时候怎么做到同步调用呢?现在我还不知道,如果有大神有幸看到这里,多谢指点!好像有个callback 功能,还没有去试过
3. page里可以根据变量自动跳转到其他界面吗?
目前没有找到自动跳转的方法, 都是需要用户触发的,用户触发的操作可以是在wxml马上跳转 (如 <nagivator>), 也可以是在js 里调用API跳转(如 wx.redirect)
4. flask 是怎么处理并发的,应用程序需要考虑多进程多线程问题吗?
flask 的app.run()有两个参数threaded和processes可以控制多线程和多进程,默认threaded=False, process=1, 也就是默认不支持多线程和多进程. 下面源码可以看出也不能同时支持多线程和多进程
def make_server(host=None, port=None, app=None, threaded=False, processes=1, request_handler=None, passthrough_errors=False, ssl_context=None, fd=None): """Create a new server instance that is either threaded, or forks or just processes one request after another. """ if threaded and processes > 1: raise ValueError("cannot have a multithreaded and " "multi process server.") elif threaded: return ThreadedWSGIServer(host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd) elif processes > 1: return ForkingWSGIServer(host, port, app, processes, request_handler, passthrough_errors, ssl_context, fd=fd) else: return BaseWSGIServer(host, port, app, request_handler, passthrough_errors, ssl_context, fd=fd)
BaseWSGIServer
这个类是使用IO 多路复用的, 关于IO多路复用,可以参考我另一个篇文章 什么是IO多路复用
Ref:
flask 源码浅析(flask 如何处理请求(多线程,多进程,IO多路复用))
Ref:
[2] 小程序的登录和数据解密全解析