• Flask长轮询即时消息


    轮询和长轮询

    轮询是每隔多久的时间请求一次
    长轮询是请求到来就夯住,并设置超时时间,有值就瞬间返回。

    from flask import Flask, render_template, session, request, jsonify
    import queue
    import uuid
    
    
    app = Flask(__name__)
    app.secret_key = str(uuid.uuid4())
    
    
    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("user_list.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)
    View Code

    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>
    View Code

     

  • 相关阅读:
    C++ 不用 < > 与 : ?运算符判断 a,b大小
    CentOS7 MariaDB10
    CentOS Linux 挂载NTFS
    Linux访问Windows共享
    Emacs配置与插件集记录
    驱动精妙耍流氓,强制安装"新毒霸"
    C# TextBox控件之大小写自动转换
    生活随笔
    显示外网IP
    MySql
  • 原文地址:https://www.cnblogs.com/Guishuzhe/p/9800242.html
Copyright © 2020-2023  润新知