Flask實作_websocket
===
###### tags: `flask` `websocket`
# 前言
websocket作為在html5後引入的功能,有別於傳統ajax需要不斷刷新頁面,websocket能夠讓瀏覽器和server以直接建立socket的方式更新瀏覽器顯示的資料,本節以flask-websocketio作為示範。
![](https://i.imgur.com/73G9E5m.png)
[flask-socket-io官方文件](https://flask-socketio.readthedocs.io/en/latest/)
# 實做內容
環境:
```
pipenv, version 9.0.1
python3.7
ubuntu 18.04
```
首先在你的python虛擬環境中安裝flask-socketio
```
pip install flask-socketio
```
建立index.html,在header 中加入下列script
```htmlmixed=
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.6/socket.io.min.js"></script>
<script type="text/javascript" charset="utf-8">
$(document).ready(function(){
var socket = io.connect();
socket.on('status_response', function(msg) {
var date = new Date();
$('#status').append('<p>status: ' + msg.data + "Time:"+ date+ '</p>');
});
});
</script>
<!-- 在body中加入status的div tag-->
<div id="status"></div>
```
`var socket = io.connect()`:建立socketio連線
接著可以看到我們建立一個`status_response`的socket event來監聽事件,當flask發送事件時`<div>`tag就會append收到的資料和當下的時間。
接下來讓我們完成flask的server端程式
```python=
from flask import Flask, request, abort, render_template, jsonify
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route("/status", methods=['GET'])
def upload():
if not request.json:
abort(400)
d = request.json.get("data", 0)
print("receive data:{}".format(d))
# do something
# 回傳給前端
socketio.emit('status_response', {'data': d})
return jsonify(
{"response": "ok"}
)
@app.route("/")
def home():
return render_template('index.html', async_mode=socketio.async_mode)
if __name__ == "__main__":
socketio.run(app, debug=True)
```
:::warning
當使用socketio時,需要將環境變數中的`export FLASK_ENV=development`移除
:::
執行`flask run`就可以看到結果了,每當`/status`被呼叫時`index.html`的`status` div tag就會新增一行資料。
![](https://i.imgur.com/i22nqQi.png)