You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何带SSL运行Flask-SocketIO应用?解决参数错误问题

解决Flask-SocketIO启用SSL时的ssl_context参数错误问题

问题原因

你遇到的错误是因为当前Flask-SocketIO使用eventlet作为后端,而eventlet的wsgi.server()方法不支持ssl_context参数,直接在socketio.run()中传入该参数会触发类型错误。

解决方案

改用eventlet提供的SSL套接字包装方式,手动创建SSL监听套接字后传给socketio.run():

  1. 确保先导入并patch eventlet(这是Flask-SocketIO使用eventlet的必要步骤):
import eventlet
eventlet.monkey_patch()
  1. 修改启动代码,创建SSL套接字并传入:
from flask import Flask
from flask_socketio import SocketIO

app = Flask(__name__)
socketio = SocketIO(app)

# 你的路由和SocketIO事件处理代码...

if __name__ == '__main__':
    # 替换为你的证书和密钥文件路径
    cert_path = 'path/to/your/certificate.pem'
    key_path = 'path/to/your/private-key.pem'
    
    # 创建带SSL的监听套接字,HTTPS默认端口为443,若需用80需额外配置端口转发
    ssl_listener = eventlet.wrap_ssl(
        eventlet.listen(('0.0.0.0', 443)),
        certfile=cert_path,
        keyfile=key_path,
        server_side=True
    )
    
    # 传入SSL套接字启动服务
    socketio.run(app, socket=ssl_listener, debug=True)

额外说明

  • 若必须使用80端口提供HTTPS服务,建议通过Nginx等反向代理做端口转发,不推荐直接让应用监听80端口处理HTTPS。
  • 若切换到gevent后端,ssl_context参数可直接使用,但需先安装gevent-websocket依赖,启动代码示例:
socketio.run(app, host="0.0.0.0", port=443, debug=True, ssl_context=(cert_path, key_path))

内容的提问来源于stack exchange,提问作者Spaffel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 19:05:23