使用Flask实现POST请求连接同服务器WebSocket可行吗?
问题分析与解决方案
你的代码出现307临时重定向的核心原因是Flask默认开发服务器是单线程模式:当POST请求进来后,服务器被该请求占用,无法同时响应自身发起的WebSocket连接请求,导致请求阻塞触发重定向。这种在同一服务内通过POST触发WebSocket调用的方式是完全可行的,只需要调整服务器的并发处理能力。
修复步骤
1. 启用多线程模式
修改启动代码,给run()方法添加threaded=True参数,让服务器可以同时处理多个请求:
from flask import Flask from flask_sock import Sock import websocket app = Flask(__name__) sock = Sock(app) @sock.route('/echo') def echo(ws): while True: data = ws.receive() print(data) ws.send(data) @app.route("/", methods=['POST']) def hello_world(): ws = websocket.WebSocket() ws.connect(f'ws://localhost:5000/echo') ws.send('hello') resp = ws.recv() ws.close() return resp # 启用多线程模式 sock.app.run(threaded=True)
2. 测试验证
启动服务后,向http://localhost:5000/发送POST请求,此时服务器可以同时处理POST请求和WebSocket连接,你会收到返回值hello。
关于ngrok的补充说明
不需要使用两个独立隧道,单隧道即可同时处理HTTP和WebSocket流量。只要本地服务修复了多线程问题,将POST请求和WebSocket连接都指向ngrok分配的地址即可(比如POST请求到https://xxx.ngrok.io/,WebSocket连接到wss://xxx.ngrok.io/echo)。
内容的提问来源于stack exchange,提问作者WhoDatBoy
相关产品推荐
相关产品推荐

