文章目录
坑好深
提示:在**Nginx**环境下:
遇到的坑:在Nginx中 flask_socketio在http中 CORS策略报错,且在ssl中无法启用wss协议。
一、CORS
Access to XMLHttpRequest at 'xxx' from origin 'http://xxx:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
提示:以下是本篇文章解决方案,下面案例可供参考
二、问题解决
1.配置Nginx ssl (wss://)
#引用反向代理规则,注释后配置的反向代理将无效
#include /www/server/panel/vhost/nginx/proxy/ofoio.com/*.conf;
location /socket.io {
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; #根据反向代理端口
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
1.引入库
其中导致 CORS策略阻止 是由 Origin 未声明
socketio = SocketIO(app)
#添加 cors_allowed_origins='*'
socketio = SocketIO(app,cors_allowed_origins='*')# 允许跨域
# encoding: utf-8
from flask import Flask, request, render_template ,session
from flask_socketio import SocketIO, emit,join_room, leave_room
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
app.jinja_env.auto_reload = True
socketio = SocketIO(app,cors_allowed_origins='*')
name_space = '/socket' # 命名空间
client_query = []
# on('消息订阅对象', '命名空间区分')
@socketio.on('message', namespace=name_space)
def message(message):
""" 服务端接收消息 """
print('message', message)
# 回传给客户端消息,也可以选择不回传
client_id = request.sid
emit('message', {'type': '101','Tips': '连接成功','sid': client_id}, broadcast=True, namespace=name_space,to=client_id) # to 发送指定已连接用户
@socketio.on('broadcast', namespace=name_space)
def broadcast(message):
"""全局广播"""
print("广播", message)
emit('broadcast', {'data': message}, broadcast=True)
@socketio.on('connect', namespace=name_space)
def connect():
"""连接成功"""
# 建立连接 sid:连接对象ID
client_id = request.sid
client_query.append(client_id)
emit('connect', {'type': '101', 'Tips': '已连接服务器', 'sid': client_id}, namespace=name_space, to=client_id) # to 发送指定已连接用户
@socketio.on('disconnect', namespace=name_space)
def disconnect():
# 连接对象关闭 删除对象ID
client_query.remove(request.sid)
if __name__ == '__main__':
socketio.run(app, host='0.0.0.0', port=8082, debug=True)
namespace = '/socket';
var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);
//连接后发送日志
socket.on('connect', function(msg){
//连接后事件
socket.emit('room', {"type":"201","Tips":"发送"}
});
总结
提示:这里对文章进行总结:
以上实践得出解决方案,小白勿喷,还有问题 评论探讨。