輪詢
通過定時器每隔多少秒發送一次請求。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> li{ cursor: pointer; } </style> </head> <body> <ul id="userList"> {% for key,val in users.items() %} <li uid="{{key}}">{{val.name}} ({{val.count}})</li> {% endfor %} </ul> <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script> <script> $(function () { $('#userList').on('dblclick','li',function () { var uid = $(this).attr('uid'); $.ajax({ url:'/vote', type:'POST', data:{uid:uid}, success:function (arg) { console.log(arg); } }) }); }); /* 獲取投票信息 */ function get_vote() { $.ajax({ url:'/get/vote', type:"GET", dataType:'JSON', success:function (arg) { $('#userList').empty(); $.each(arg,function (k,v) { var li = document.createElement('li'); li.setAttribute('uid',k); li.innerText = v.name + "(" + v.count + ')' ; $('#userList').append(li); }) } }) } setInterval(get_vote,3000); </script> </body> </html>
app.py
from flask import Flask,render_template,request,jsonify
app = Flask(__name__)
USERS = {
'1':{'name':'貝貝','count':1},
'2':{'name':'小東北','count':0},
'3':{'name':'何偉明','count':0},
}
@app.route('/user/list')
def user_list():
import time
return render_template('user_list.html',users=USERS)
@app.route('/vote',methods=['POST'])
def vote():
uid = request.form.get('uid')
USERS[uid]['count'] += 1
return "投票成功"
@app.route('/get/vote',methods=['GET'])
def get_vote():
return jsonify(USERS)
if __name__ == '__main__':
# app.run(host='192.168.13.253',threaded=True)
app.run(threaded=True) #多線程
app1.py
from flask import Flask,render_template,request,jsonify
app = Flask(__name__)
import queue
q = queue.Queue()
@app.route('/get/vote')
def get_vote():
try:
val = q.get(timeout=20)
except queue.Empty:
val = "已超時"
return val
@app.route('/vote')
def vote():
q.put('10')
return '投票成功'
if __name__ == '__main__':
# app.run(host='192.168.13.253',threaded=True)
app.run(threaded=True)
隊列.py
import queue
q = queue.Queue()
q.put('123')
val = q.get()
print(val)
try:
val = q.get(timeout=5)
print(val)
except queue.Empty:
pass
長輪詢
用法:讓瀏覽器發送一次請求,會把請求夯住,最多會夯住多少秒,如果在這一段時間內,沒有人再來發送數據,就讓他等30秒釋放,如果在這30秒中有人發數據,會立即拿到結果立即返回。
優勢:結果實時化,省去了連接的次數
應用場景:
-實時
-在線
websocket也可以實現以上場景,但兼容性不好(基於html5)
長輪詢兼容性好
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> li{ cursor: pointer; } </style> </head> <body> <ul id="userList"> {% for key,val in users.items() %} <li uid="{{key}}">{{val.name}} ({{val.count}})</li> {% endfor %} </ul> <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script> <script> $(function () { $('#userList').on('click','li',function () { var uid = $(this).attr('uid'); $.ajax({ url:'/vote', type:'POST', data:{uid:uid}, success:function (arg) { console.log(arg); } }) }); get_vote(); }); /* 獲取投票信息 */ function get_vote() { $.ajax({ url:'/get/vote', type:"GET", dataType:'JSON', success:function (arg) { if(arg.status){ $('#userList').empty(); $.each(arg.data,function (k,v) { var li = document.createElement('li'); li.setAttribute('uid',k); li.innerText = v.name + "(" + v.count + ')' ; $('#userList').append(li); }) } get_vote(); } }) } </script> </body> </html>
app.py
from flask import Flask,render_template,request,jsonify,session
import uuid
import queue
app = Flask(__name__)
app.secret_key = 'asdfasdfasd'
USERS = {
'1':{'name':'貝貝','count':1},
'2':{'name':'小東北','count':0},
'3':{'name':'何偉明','count':0},
}
QUEQUE_DICT = {
# 'asdfasdfasdfasdf':Queue()
}
@app.route('/user/list')
def user_list():
user_uuid = str(uuid.uuid4())
QUEQUE_DICT[user_uuid] = queue.Queue()
session['current_user_uuid'] = user_uuid
return render_template('user_list.html',users=USERS)
@app.route('/vote',methods=['POST'])
def vote():
uid = request.form.get('uid')
USERS[uid]['count'] += 1
for q in QUEQUE_DICT.values():
q.put(USERS)
return "投票成功"
@app.route('/get/vote',methods=['GET'])
def get_vote():
user_uuid = session['current_user_uuid']
q = QUEQUE_DICT[user_uuid]
ret = {'status':True,'data':None}
try:
users = q.get(timeout=5)
ret['data'] = users
except queue.Empty:
ret['status'] = False
return jsonify(ret)
if __name__ == '__main__':
app.run(host='192.168.13.253',threaded=True)
# app.run(threaded=True)
app1.py
from flask import Flask,render_template,request,jsonify
app = Flask(__name__)
import queue
q = queue.Queue()
@app.route('/get/vote')
def get_vote():
try:
val = q.get(timeout=20)
except queue.Empty:
val = "已超時"
return val
@app.route('/vote')
def vote():
q.put('10')
return '投票成功'
if __name__ == '__main__':
# app.run(host='192.168.13.253',threaded=True)
app.run(threaded=True)
隊列.py
import queue
q = queue.Queue()
q.put('123')
val = q.get()
print(val)
try:
val = q.get(timeout=5)
print(val)
except queue.Empty:
pass
