如何在服务器上部署 Flask-SocketIO?
How to deploy Flask-SocketIO on server?
我做了一个项目,使用 flask_socketio
用户通知扩展,我想将它部署在服务器上。
我已经读完 Flask-SocketIO
documentation 并且只是按字面意思完成了 部署部分。
现在,如果我 运行 应用程序在开始时一切正常,在控制台中,如果用户登录,我刚刚记录了一条消息,上面写着 User Connected! 只是为了确保它有效。
现在,我已登录并且该网站运行正常,但如果我想浏览该网站的其他页面,它会闲逛一段时间,比如说 30 秒,它会将我注销。
下面是一些代码片段:
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>
myapp.service 这里是 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
这也是我的项目 config 文件 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;
}
}
这是我可以提供的所有代码,我重复一遍,网站工作正常,当用户登录我的家时,我可以在控制台中看到 User Connected! 消息页面,但如果我想浏览其他页面,则会发生挂起,并将我从站点注销。
我忘了在控制台中显示我确实遇到的错误:
http://123.45.678.901/socket.io/?EIO=3&transport=polling&t=LtFziAg&sid=636e939b538f4b0ca6df5cd521c2e187 400 (BAD REQUEST)
问题已解决,我必须定义在 SocketIO
结构中使用哪个 async_mode。
Flask-SocketIO
默认为 Eventlet
提供第一选择,第二选择为 Gevent
,有关更多信息,请阅读此 issues/294
要解决此类问题,只需将其添加到您的代码中即可:
socketio = SocketIO(async_mode='gevent')
我做了一个项目,使用 flask_socketio
用户通知扩展,我想将它部署在服务器上。
我已经读完 Flask-SocketIO
documentation 并且只是按字面意思完成了 部署部分。
现在,如果我 运行 应用程序在开始时一切正常,在控制台中,如果用户登录,我刚刚记录了一条消息,上面写着 User Connected! 只是为了确保它有效。
现在,我已登录并且该网站运行正常,但如果我想浏览该网站的其他页面,它会闲逛一段时间,比如说 30 秒,它会将我注销。
下面是一些代码片段:
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>
myapp.service 这里是 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
这也是我的项目 config 文件 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;
}
}
这是我可以提供的所有代码,我重复一遍,网站工作正常,当用户登录我的家时,我可以在控制台中看到 User Connected! 消息页面,但如果我想浏览其他页面,则会发生挂起,并将我从站点注销。
我忘了在控制台中显示我确实遇到的错误:
http://123.45.678.901/socket.io/?EIO=3&transport=polling&t=LtFziAg&sid=636e939b538f4b0ca6df5cd521c2e187 400 (BAD REQUEST)
问题已解决,我必须定义在 SocketIO
结构中使用哪个 async_mode。
Flask-SocketIO
默认为 Eventlet
提供第一选择,第二选择为 Gevent
,有关更多信息,请阅读此 issues/294
要解决此类问题,只需将其添加到您的代码中即可:
socketio = SocketIO(async_mode='gevent')