前两天跟着视频写了个flask投票功能代码,利用长轮询实现票数实时更新,结果不是我想要的结果,票数总是等到夯住超时才能更新,通过浏览器F12键网络追踪,发现点击投票也能立即响应,但原先夯住的线程继续被夯住。又从网上找的投票功能代码,尝试还是如此,坑了很久才知道是启动方式不同引起的。因为我是在已经有的项目中加的投票功能,而这个项目调试启动是命令行:python manage.py runserver,结果就出现以上问题。没办法将它分离出来,单独运行又正常,后来再加上Manager,使用命令行启动python manage.py runserver,还是不能实时更新票数。发现只要不是Manager托管启动就没问题,实在不知什么原因?请大神指点。
manage.py:
from flask import Flask, render_template, session, request, jsonify
import queue
import uuid
from flask_script import Manager
app = Flask(__name__)
app.secret_key = str(uuid.uuid4())
manager=Manager(app)
USERS = {
'1': {'name': '小黑', 'count': 1},
'2': {'name': '小胖', 'count': 0},
'3': {'name': '小铁锤', 'count': 0},
}
QUEUE_DICT = {
# 'uuid': Queue()队列 格式
}
@app.route("/user/list")
def user_list():
user_uuid = str(uuid.uuid4()) # 生成用户随机字符串
QUEUE_DICT[user_uuid] = queue.Queue() # 引用队列消息
session["current_user_uuid"] = user_uuid # session存放uuid字符串
return render_template("vote.html", users=USERS)
@app.route("/vote", methods=["POST"])
def vote():
uid = request.form.get('uid') # 获取uuid值
USERS[uid]['count'] += 1 # 让字典中的值自增
for q in QUEUE_DICT.values(): # 循环获取队列中的值并添加到USERS
q.put(USERS)
return "投票成功"
@app.route("/get/vote", methods=["get"])
def get_vote():
user_uuid = session["current_user_uuid"] # 获取session中的存储的uuid值
q = QUEUE_DICT[user_uuid] # 获取字典中uuid对应的Q()
ret = {"status": True, "data": None} # 返回状态码
try:
users = q.get(timeout=5) # 异常就夯(hang)住5秒
ret["data"] = users
except queue.Empty:
ret["status"] = False
return jsonify(ret)
if __name__ == '__main__':
manager.run()
vote.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width initial-scale=1.0">
<title>Title</title>
<style>
li{cursor: pointer;
background-color: dodgerblue;
margin: 10px;
padding: 10px;
list-style-type: none;
text-align: center;
font-size: 18px;
}
</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"); // 找到id
$.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", // 获取json的数据格式
success:function (arg) {
if(arg.status){
$("#userList").empty(); // 清空页面
$.each(arg.data, function (k, v) { // 循环
var li = document.createElement("li"); // 生成li标签
li.setAttribute("uid", k); // 设置属性uid=k
li.innerText = v.name + "(" + v.count + ")"; // 拼接内容
$("#userList").append(li);
})
}
get_vote(); // 和前面的调用形成循环
}
})
}
</script>
</body>
</html>