0
点赞
收藏
分享

微信扫一扫

flask_socketio Nginx 环境下 不启用wss问题 和CORS 400错误

凛冬已至夏日未远 2022-04-22 阅读 21

文章目录


坑好深

提示:在**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":"发送"}
});

总结

提示:这里对文章进行总结:
以上实践得出解决方案,小白勿喷,还有问题 评论探讨。

举报

相关推荐

0 条评论