烧瓶 socketio CORS

Posted

技术标签:

【中文标题】烧瓶 socketio CORS【英文标题】:flask socketio CORS 【发布时间】:2015-05-25 03:01:06 【问题描述】:

我一直在尝试通过套接字 io 从烧瓶发送数据。我需要从不同的来源访问这些数据,但它给出了 CORS 错误。我尝试过使用各种跨来源的东西,但都没有奏效。有人可以帮忙吗?

应该调用think socket io的视图:

from flask.ext.cors import cross_origin
@socketio.on('increment',namespace="/api")
@cross_origin()
def increment(message):
    number += 1;
    emit('number','data':number,broadcast=True)

运行服务器:

app = Flask(__name__)
cors = CORS(app,resources=r"/api/*":"origins":"*")
socketio = SocketIO(app)
app.debug = True
app.host = '0.0.0.0'

socketio.run(app)

【问题讨论】:

socket.io 事件不是正常的 Flask 路由,你不能使用像 Flask-CORS 中的 cross_origin 这样的常规路由装饰器。我认为您需要进一步调查这个问题,CORS 支持已经在 Flask-SocketIO 使用的gevent-socketio 中实现。也许看看浏览器调试器中的请求,看看错误发生在哪里。我刚刚用 Flask-SocketIO 示例应用程序测试了跨域,它无需做任何不同的事情就可以工作。 【参考方案1】:

我通过以下方式解决了:

socketio = SocketIO(app, cors_allowed_origins="*")

【讨论】:

wrap_socket() 得到了一个意外的关键字参数 'cors_allowed_origins' 我得到了这个错误 我也没有获得自动完成功能,最新版本的软件包可能已将其删除。有什么可以用的替代品吗?【参考方案2】:

我遇到了类似的问题,可以使用此设置:

#you may not need all these options
from flask import Flask, render_template, request
from flask.ext.socketio import SocketIO, emit, join_room, leave_room
from flask.ext.cors import CORS

app = Flask(__name__, template_folder='./', static_folder='./', static_url_path='')
app.config['SECRET_KEY'] = 'some-super-secret-key'
app.config['DEFAULT_PARSERS'] = [
    'flask.ext.api.parsers.JSONParser',
    'flask.ext.api.parsers.URLEncodedParser',
    'flask.ext.api.parsers.FormParser',
    'flask.ext.api.parsers.MultiPartParser'
]
cors = CORS(app,resources=r"/*":"origins":"*")
socketio = SocketIO(app)
socketio.run(app,port=5000,host='0.0.0.0')

您可以这样设置路线:

@app.route("/")
def indexRoute():
    return render_template('index.html',version=VER)

和套接字请求:

@socketio.on('connect',namespace="/home")
def test_connect():
    print "client connected:",rooms()[0]

在 JS 的客户端我做了以下操作:

var socket = io.connect('http://' + location.hostname + ':5000/home');
socket.on('connect',function(data) 
    console.log('connected to socket');
);

另外,请查看来自 Flask 开发人员的 thissn-p。

【讨论】:

【参考方案3】:

检查您的 html 文件中是否使用了受支持的 socket.io 版本。

<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.js" integrity="sha512-aMGMvNYu8Ue4G+fHa359jcPb1u+ytAF+P2SCb+PxrjCdO3n3ZTxJ30zuH39rimUggmTwmh2u7wvQsDTHESnmfQ==" crossorigin="anonymous"></script>

【讨论】:

【参考方案4】:

由于某种原因,cors_allowed_origins="*" 对我不起作用。我必须改为指定原点的完整地址,如下所示:

socketio = SocketIO(app, cors_allowed_origins=['http://127.0.0.1:5500']) 

"&lt;client_address&gt; is not an accepted origin. (further occurrences of this error will be logged with level info)" 的错误消息应该指出您应该输入哪个地址。

【讨论】:

以上是关于烧瓶 socketio CORS的主要内容,如果未能解决你的问题,请参考以下文章

在 SocketIO 命名空间中使用烧瓶会话数据时出错

烧瓶-SocketIO + uWSGI。与 Mule 工人一起发射

使用烧瓶socketio经常断开套接字连接

html 蟒蛇,烧瓶,socketio

在 Uwsgi 和 Nginx 上使用 SocketIO 烧瓶

如何访问使用 websockets 发送的烧瓶中的 formData?Flask-SocketIO