美文网首页
Flask使用websocket

Flask使用websocket

作者: no_ones | 来源:发表于2019-12-21 20:22 被阅读0次

    前后端分离对于websocket就是个坑。。

    想用websocket来搭建一个聊天室,前后端分离(高大上!?),这里记录一下走过的坑。
    首先说明一下我遇到的问题:

    websocket连connect都做不到,浏览器提示CORS问题,需要跨域头部,后台显示400状态访问

    浏览器提示没有跨域头不一定就是CORS设置异常

    在这里卡了许久,一直以为自己的跨域设置有问题
    一般设置为

    from flask_cors import CORS
    ...
    CORS(app, supports_credentials=True, resources=r'/*')
    

    就OK了,通过路由访问没问题,但websocket疯狂报错,网上跨域设置都尝试了下,没得用,暂时搁置
    而且最后找到问题后,不用设置跨域就能访问??(搞不懂

    分析github已有项目,来找茬

    最后是在这里解决的,gayhub上的源码一般clone下来都能跑,就将后端替换成自己的项目
    最后我的解决方案是,更换为旧版本

    ---------------- -------
    aniso8601        8.0.0
    Click            7.0
    dnspython        1.16.0
    eventlet         0.19.0
    Flask            1.1.1
    Flask-Cors       3.0.8
    Flask-HTTPAuth   3.3.0
    Flask-RESTful    0.3.7
    Flask-SocketIO   2.4 <--最新的不行,这个就可以
    Flask-SQLAlchemy 2.4.1
    greenlet         0.4.15
    itsdangerous     1.1.0
    Jinja2           2.10.3
    MarkupSafe       1.1.1
    monotonic        1.5
    passlib          1.7.2
    pip              19.3.1
    pkg-resources    0.0.0
    PyMySQL          0.9.3
    python-engineio  0.9.1<--也要换成相应
    python-socketio  1.3<--配套的版本
    pytz             2019.3
    setuptools       39.0.1
    six              1.13.0
    SQLAlchemy       1.3.11
    Werkzeug         0.16.0
    
    

    最后附上测试代码

    from flask import Flask, jsonify
    from flask_socketio import SocketIO, emit
    import eventlet
    
    
    eventlet.monkey_patch()
    
    app = Flask(__name__)
    socketio = SocketIO(app)
    
    
    @app.route('/')
    def index():
        return jsonify({'message': 'Index page'})
    
    
    @socketio.on('connect')
    def socketio_connect():
        print('Client has connected to the backend')
        emit('event', {'message': 'ACK'})
    
    
    @socketio.on('event')
    def socketio_message_event(message):
        print('Received event: ' + str(message))
        emit('response', {'message': 'Copy that'})
    
    
    @socketio.on('response')
    def socketio_message_response(message):
        print('Received response: ' + str(message))
    
    
    if __name__ == '__main__':
        socketio.run(app, host='0.0.0.0', debug=True)
    

    来源:https://github.com/Celeo/Vue-Flask-WebSockets

    相关文章

      网友评论

          本文标题:Flask使用websocket

          本文链接:https://www.haomeiwen.com/subject/vdzgnctx.html