手上有個微信小程序項目,因為對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] 小程序的登錄和數據解密全解析