sunlong88

- flask默认使用wsgi支持http协议,如需使用websocket需要安装gevent-websocket模块,http,websocket协议都可以支持

  Django应用:channel
  Tornado应用:自己有

 pip3 install gevent-websocket

app.py

from flask import Flask,request,render_template,redirect,session
import uuid
from geventwebsocket.handler import WebSocketHandler
from gevent.pywsgi import WSGIServer
import json


app = Flask(__name__)
app.secret_key = \';lkjnfdidiclsjek\'

GENTIEMAN = {
    \'1\':{\'name\':\'钢弹\',\'count\':0},
    \'2\':{\'name\':\'铁锤\',\'count\':0},
    \'3\':{\'name\':\'闫帅\',\'count\':0},
}

WEBSOCKET_DICT = {}

@app.before_request
def before_reuqest():
    if request.path == \'/login\':
        return None
    user_info = session.get(\'user_info\')
    if user_info:
        return None
    return redirect(\'login\')

@app.route(\'/login\',methods=[\'GET\',\'POST\'])
def login():
    if request.method == \'GET\':
        return render_template(\'login.html\')
    else:
        uid = str(uuid.uuid4())
        session[\'user_info\'] = {\'id\':uid,\'name\':request.form.get(\'user\')}
        return redirect(\'/index\')


@app.route(\'/index\')
def index():
    return render_template(\'index.html\',users=GENTIEMAN)

@app.route(\'/message\')
def message():
    # 1. 判断是否为Websocket请求,http不包含wsgi.websocket
    ws = request.environ.get(\'wsgi.websocket\')
    if not ws:
        return \'use websocket\'
    # 此处连接成功
    current_user_id = session[\'user_info\'][\'id\']
    WEBSOCKET_DICT[current_user_id] = ws
    while True:
        # 2. 等待用户发送消息,并接受
        message = ws.receive()  # 投票对应的ID

        # 关闭 mesaage = None
        if not message:
            del WEBSOCKET_DICT[current_user_id]
            break

        # 3. 获取用户要投票的ID,并+1
        old = GENTIEMAN[message][\'count\']
        new = old + 1
        GENTIEMAN[message][\'count\'] = new

        data = {\'user_id\':message,\'count\':new,\'type\':\'vote\'}
        # 给所有客户端推送消息
        for conn in WEBSOCKET_DICT.values():
            conn.send(json.dumps(data))
    return \'完毕\'

@app.route(\'/notify\')
def notify():
    data = {\'data\':\'订单生成\',\'type\':\'alert\'}
    for conn in WEBSOCKET_DICT.values():
        conn.send(json.dumps(data))
    return \'完毕\'

if __name__ == \'__main__\':
    # 如果是http请求走app使用原有的wsgi处理,如果是websocket请求走WebSocketHandler处理
    http_server = WSGIServer((\'127.0.0.1\', 5000), app, handler_class=WebSocketHandler)
    http_server.serve_forever()

index.html

<body>
    <h1>投票系统:参与投票的人</h1>
    <ul>
        {% for k,v in users.items() %}
            <li id="user_{{k}}" ondblclick="vote(\'{{k}}\')">{{v.name}} <span>{{v.count}}</span> </li>
        {% endfor %}

    </ul>
    <script src="{{ url_for(\'static\',filename=\'jquery-3.3.1.min.js\')}}"></script>
    <script>
        var socket = new WebSocket("ws://127.0.0.1:5000/message");

        socket.onmessage = function (event) {
            /* 服务器端向客户端发送数据时,自动执行 */
            var response = JSON.parse(event.data); // {\'user\':1,\'count\':new}
            if(response.type == \'vote\'){
                var nid = \'#user_\' + response.user_id;
                $(nid).find(\'span\').text(response.count)
            }else{
                alert(response.data);
            }

        };

        /*
        我要给某人投票
         */
         function vote(id) {
            socket.send(id);
        }

    </script>
</body>

 

login.html

<body>
<form method="post">
    <input type="text" name="user">
    <input type="submit" value="提交">
</form>
</body>

 

分类:

技术点:

相关文章:

  • 2021-11-27
  • 2021-11-27
  • 2021-04-20
  • 2021-09-04
  • 2020-12-19
猜你喜欢
  • 2021-11-27
  • 2021-11-27
  • 2021-11-27
  • 2021-05-17
  • 2021-12-07
  • 2021-12-04
  • 2021-08-22
相关资源
相似解决方案