为什么flask启动方式影响项目投票功能运行结果?

 
前两天跟着视频写了个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>
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问