創新實訓——003

之前後端本來想用spring boot的,但是之前並未與redis一起使用過,所以後端換到flask,發現flask上手比較簡單。

本篇博客來學習下flask
參考文檔:flask參考文檔

flask安裝

pycharm下新建工程後,可界面裏安裝flask或pip install flask
如果報werkzeug的錯,那麼重新下一下它

一個最小的應用

hello world

from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello_world():
    return "Hello,World!"
if __name__ == '__main__':
    app.run()

此時訪問http://127.0.0.1:5000/就可以看到hello world了

開始拓展

get傳參請求
from flask import Flask
from flask import request
import pymysql
app=Flask(__name__)
@app.route('/')
def hello_world():
    return "Hello,World!"
@app.route('/testGet',methods=['get'])
def get_data():
    data=request.args.get('data')
    return data
if __name__ == '__main__':
    app.run()

此時訪問http://127.0.0.1:5000/testGet?data=123,頁面中會出現123

查詢mysql數據庫

其實一開始用到的也就只有這些,然後現在開始看看如何連接mysql數據庫來查詢數據
最初構想就是使用pymysql庫去連接後,構造sql請求去查詢值

from flask import Flask
from flask import request
import pymysql
import json
app=Flask(__name__)
# 開始數據庫連接
db=pymysql.connect(
    host='127.0.0.1',
    user='root',
    password='***',
    database='epidemic'
)
# 使用cursor()方法創建一個遊標對象
cursor=db.cursor()
@app.route('/')
def hello_world():
    return "Hello,World!"
@app.route('/testGet',methods=['get'])
def get_data():
    dateId=request.args.get('dateId')
    searchSql='select * from countrydata where dateId="%s"'%(dateId)
    cursor.execute(searchSql)
    dataList=cursor.fetchall()
    print(dataList)
    return json.dumps(dataList)#注意這裏若返回原生的查詢結果會報錯,最好返回json
if __name__ == '__main__':
    app.run()
連接redis
from flask import Flask
from flask import request
import pymysql
import json
import redis
app=Flask(__name__)
# 開始redis連接
# 實現一個連接池
pool=redis.ConnectionPool(host='***',password='***')
r=redis.Redis(connection_pool=pool)
r.set('name','redis')
@app.route('/')
def hello_world():
    return "Hello,World!"
if __name__ == '__main__':
    app.run()

其他redis操作可參見該博客:參考博客

websocket

由於後端要給前端實時提供最新的數據,所以要使用web socket,flask有flask-socketio
我們這裏以前端vue動態顯示時間爲例
首先要安裝flask-socketio、gen-websocket和evenlet,可以pip安裝
flask-socketio的文檔見flask-socketio文檔
evenlet
socketIO有事件概念,又分爲匿名與不匿名,自定義等

from flask import Flask
from flask import request
import pymysql
import json
import redis
from flask_socketio import SocketIO,send,emit
import time
from threading import Lock
app=Flask(__name__)
app.config['SECRET_KEY']='password'#Session, Cookies以及一些第三方擴展都會用到SECRET_KEY值
thread=None
thread_lock=Lock()
#建立socketIO
socketIO=SocketIO(app,cors_allowed_origins="*",async_mode=None)
# 測試socketIO
def getTheCurrTime():
    while True:
        socketIO.sleep(1)
        current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        socketIO.emit('currTime',
                        {'data': current_time},
                        namespace='/currTime')
# 系統時間
@socketIO.on('connect', namespace='/currTime')
def currTime():
    global thread
    with thread_lock:
        if thread is None:
            thread=socketIO.start_background_task(target=getTheCurrTime)

if __name__ == '__main__':
    socketIO.run(app,port=8081,debug=True)

前端vue,也需要下載配置socket.io-client,不要用vue-socket.io這個我怎麼配置也沒配好
npm卸載模塊命令:npm uninstall

#新建了一個頁面firstPage.vue
<template>
  <div>
    <h1>{{ msg }}</h1>
    <h2>Essential Links</h2>
  </div>
</template>
<script>
import io from 'socket.io-client'
export default {
  name: 'firstPage',
  data () {
    return {
      msg: 'Welcome to Web-Log-Analyse',
      socket:null
    }
  },
  mounted(){
      var namespace = '/currTime';
      this.socket = io.connect(location.protocol + '//' + document.domain + ':8081'  + namespace);
      var that=this
      this.socket.on('currTime', function(res) {
        console.log(res.data);
        that.msg=res.data
      });
  },
  beforeDestroy(){
      this.socket.close();//防止離開頁面後還在監聽,造成數據重複
  }
}
</script>

然後前端的時間是實時變化的,這裏我要重點強調一下:
一定要在beforeDestroy這個階段將socket關閉,否則會造成很多連接建立
至此對於flask已經可以滿足簡單應用了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章