之前後端本來想用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已經可以滿足簡單應用了