代码之家  ›  专栏  ›  技术社区  ›  makmani

如何在服务器上部署Flask SocketIO?

  •  1
  • makmani  · 技术社区  · 7 年前

    我做了一个项目 flask_socketio

    我已经读完了 Flask-SocketIO documentation .

    用户已连接!

    以下是一些代码片段:

    base.html 扩展了所有页面的基数

    <script type="text/javascript">
        var socket = io.connect('http://' + document.domain + ':' + location.port + '/notifications-{{session.get("client_logged_in")}}-{{session.get("client_family")}}');
        var appointments_received = [];
        socket.on('connect', function(){
            console.log('User Connected!');
        });
        socket.on('new_message', function(msgChat){
            $('<li class="notification">\
                    <div class="notification_client_ava_border">\
                        {% if '+msgChat.image+' %}\
                            <img src="/static/img/'+msgChat.image+'" alt="myproject" class="notification_client_ava">\
                            {% else %}\
                                <img src="/static/img/main.png" alt="myproject" class="notification_client_ava">\
                        {% endif %}\
                    </div>\
                    <div class="notification_info">\
                        <div class="client_info">\
                            <p class="user_name">\
                                You have new message from: '+msgChat.from+'\
                                '+shortName+'\
                            </p>\
                        </div>\
                        <br>\
                        <div class="service_info">\
                            {% if '+actionArray[0] == +' "Message:" %}\
                                <span>'+msgChat.message+'</span></br>\
                            {% endif %}\
                        </div>\
                        <br><br>\
                        <div class="">\
                            <span class="date">\
                                    '+moment().fromNow()+'\
                            </span>\
                        </div>\
                    </div>\
                    <div class="notification_action">\
                        <a href="/user/cat-{{g.current_directory}}/chat/'+msgChat.to_url_+'?current_user={{session.get("client_logged_in")}}+{{session.get("client_family")}}" id="noty_read" class="btn btn-primary btn-block" data-get='+msgChat.noty_id+'>read it</a>\
                    </div>\
                </li>'
            ).appendTo('ul#messages_list');
        });
    </script>
    

    这里是Gunicorn实例,用于在系统目录中为我的项目提供服务

    [Unit]
    Description=Gunicorn
    After=network.target
    
    [Service]
    User=gard
    WorkingDirectory=/home/gard/myproject
    Environment="PATH=/home/gard/myproject/venv/bin"
    ExecStart=/home/gard/myproject/venv/bin/gunicorn --bind 0.0.0.0:5000 manage:app
    
    [Install]
    WantedBy=multi-user.target
    

    这也是我的项目 配置 归档 Nginx 用于服务我的项目:

    server {
        listen 80;
        server_name 123.45.678.901;
        location / {
            proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            if (!-f $request_filename) {
                proxy_pass http://127.0.0.1:5000;
                break;
            }
        }
        location /socket.io {
            include proxy_params;
            proxy_http_version 1.1;
            proxy_buffering off;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_pass http://127.0.0.1:5000/socket.io;
        }
    }
    

    这里是我能提供的所有代码,我重复一遍,网站工作很好,我可以看到 当用户登录我的主页时,控制台内的消息,但如果我想浏览其他页面,就会发生挂起,并将我注销网站。

    我忘了在控制台中显示我确实遇到的错误:

    http://123.45.678.901/socket.io/?EIO=3&transport=polling&t=LtFziAg&sid=636e939b538f4b0ca6df5cd521c2e187 400 (BAD REQUEST)

    1 回复  |  直到 7 年前
        1
  •  1
  •   makmani    7 年前

    SocketIO 结构

    Flask-SocketIO Eventlet ,第二个选择是 Gevent ,有关更多信息,请阅读此 issues/294

    要解决此类问题,只需将其添加到代码中: