代码之家  ›  专栏  ›  技术社区  ›  MJC

EventSource消息的Python Flask服务器产生随机/重复的SSL错误:EOF违反协议

  •  0
  • MJC  · 技术社区  · 1 年前

    我对Python还很陌生,正试图编写一个相当简单的EventSource服务器,以便在5秒内吐出一些数据(目前只是一个测试字符串)。当我连接到javascript客户端时,它工作得很好,但最终开始产生SSL错误。这些错误似乎不会阻止脚本继续工作,ES消息也会继续发送,但理想情况下,我想找到一个解决方案。

    我的代码如下:

    import json
    import time
    from flask import Flask, Response
    from flask_sslify import SSLify
    
    app = Flask(__name__)
    sslify = SSLify(app)
    
    @app.route('/events')
    def events():
        def generate():
            while True:
                yield "data: hi there\n\n"
                time.sleep(5)
    
        response = Response(generate(), content_type='text/event-stream')
        response.headers['Access-Control-Allow-Origin'] = 'https://example.com'
        return response
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0', port=4443, ssl_context=('server.crt', 'server.key'))
    

    当我运行该代码并通过浏览器访问时,我会收到以下错误(似乎是随机重复发生的):

    D:\WebRoot\Python>py ESServer.py
     * Serving Flask app 'ESServer'
     * Debug mode: on
    WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
     * Running on all addresses (0.0.0.0)
     * Running on https://127.0.0.1:4443
     * Running on https://x.x.x.x:4443
    Press CTRL+C to quit
     * Debugger PIN: 115-453-164
    10.7.102.201 - - [21/Feb/2024 15:32:12] "GET /events HTTP/1.1" 200 -
    10.7.102.201 - - [21/Feb/2024 15:34:55] "GET /events HTTP/1.1" 200 -
    Error on request:
    Traceback (most recent call last):
      File "D:\Python311\Lib\site-packages\werkzeug\serving.py", line 362, in run_wsgi
        execute(self.server.app)
      File "D:\Python311\Lib\site-packages\werkzeug\serving.py", line 326, in execute
        write(data)
      File "D:\Python311\Lib\site-packages\werkzeug\serving.py", line 298, in write
        self.wfile.write(hex(len(data))[2:].encode())
      File "D:\Python311\Lib\socketserver.py", line 834, in write
        self._sock.sendall(b)
      File "D:\Python311\Lib\ssl.py", line 1241, in sendall
        v = self.send(byte_view[count:])
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "D:\Python311\Lib\ssl.py", line 1210, in send
        return self._sslobj.write(data)
               ^^^^^^^^^^^^^^^^^^^^^^^^
    ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:2423)
    

    我不确定这是客户端的问题还是服务器端的问题;也不知道是MY代码的问题还是SSL库本身的问题。FWIW我安装了最新版本的烧瓶和烧瓶。

    0 回复  |  直到 1 年前