首页 > 解决方案 > websocket连接发生时会话变量值不更新 - Python

问题描述

我正在创建一个 API 来向回显服务器发送消息

为此,我使用来自该站点https://www.websocket.org/echo.html的回声聊天服务器 URL ws://echo.websocket.org/。这种连接将回显我们的输入。

当用户第一次请求 API 时,我需要与 echo server 建立连接并将用户消息发送到 echo server。当第二次用户请求相同的 API 时,这一次连接已经建立。所以,我只需要将用户消息发送到回显服务器。

为此,我使用 python session 来存储连接详细信息。第一次建立连接时,我试图将其保存在会话中。session['ConnetionMade'] = "True"默认为假

因此,当用户第二次请求 API 时,这次 ConnetionMade 为 True。所以,我不再建立联系。

但是这里的会话变量在建立连接时不会更新。它总是错误的。但我们设置为 True。

以下是完整的工作代码。请帮我更新会话变量。

注意:当我们跳过套接字连接代码时,会话变量起作用

from flask import Flask
from flask import request, session
from config import config
import websocket

try:
    import thread
except ImportError:
    import _thread as thread


SECRET_KEY = 'a secret key'

app = Flask(__name__)
app.config.from_object(__name__)

@app.route('/')
def root():
    return 'Hello NLP....!'

userMessage = ""
@app.route('/whatsapp', methods=['POST'])
def echo():
    global userMessage
    userMessage = request.json['message']

    # session.clear()

    print("\n\nuserMessage: ", userMessage, "\n\n")

    print("ConnetionMade--: ", session.get('ConnetionMade', "False"))

    if session.get('ConnetionMade', "False") == "False":
        session['ConnetionMade'] = "True"
        print('True set to ConnetionMade ', session.get('ConnetionMade', "False"))
        echoConnection()
    else:
        session['ConnetionMade'] = "False"
        print('False set to ConnetionMade ', session.get('ConnetionMade', "False"))


    return ""


def echoConnection():

    if __name__ == "__main__":
        websocket.enableTrace(True)
        ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                                  on_open = on_open,
                                  on_message = on_message,
                                  on_error = on_error,
                                  on_close = on_close)

        ws.run_forever()

    return ""

def on_message(ws, message):
    print("\n\nMessage received from Echo Socket server:", message, '\n\n')
    return

def on_error(ws, error):
    print("on_error ", error)
    return

def on_close(ws):
    print("on_close")
    return

def on_open(ws):
    def run(*args):

        print("\n\nSocket connection made. Now sending this message ("+userMessage+") to Echo Socket server\n\n")
        ws.send(userMessage)
        print("\nsent...\n")
        print("thread terminating...")

    thread.start_new_thread(run, ())

    return

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=config['server']['port'])

标签: pythonwebsocketsocket.ioclient

解决方案


在您的情况下,ws.run_forever()阻塞线程,然后对 API 的进一步调用不会被捕获。

您可以在守护线程中运行 websocket,并确保使用其send方法与 websocket 服务器进行通信。

像这样的东西:

from flask import Flask
from flask import request, session
import websocket
import threading

SECRET_KEY = 'a secret key'

app = Flask(__name__)
app.config.from_object(__name__)

websocket_client = None

@app.route('/')
def root():
    return 'Hello NLP....!'

@app.route('/whatsapp', methods=['POST'])
def echo():
    userMessage = request.json['message']

    # session.clear()
    print("userMessage: ", userMessage, "\n")
    print("ConnetionMade--: ", session.get('ConnetionMade', "False"))

    if session.get('ConnetionMade', "False") == "False":
        session['ConnetionMade'] = "True"
        print('True set to ConnetionMade ', session.get('ConnetionMade', "False"))
        send_message_to_websocket_server(userMessage)

    return ""

def send_message_to_websocket_server(message):
    print("Sending message to WebSocket Server")
    websocket_client.send(message)

def createConnection():
    ws = websocket.WebSocketApp("ws://echo.websocket.org/",
                              on_open = on_open,
                              on_message = on_message,
                              on_error = on_error,
                              on_close = on_close)

    # Initialise the run_forever inside a thread and make this thread as a daemon thread
    wst = threading.Thread(target=ws.run_forever)
    wst.daemon = True
    wst.start()
    return ws

def on_message(ws, message):
    print("Message received from Echo Socket server:", message)

def on_error(ws, error):
    print("on_error ", error)

def on_close(ws):
    print("on_close")

def on_open(ws):
    print("Socket connection opened")

if __name__ == "__main__":
    websocket_client = createConnection()
    app.run(host='0.0.0.0', port=8001)  # I have hardcoded the port to test this

现在,如果我考虑到会话并使用以下命令点击它,则使用 Curl,如果会话是新的,它只会向 websocket 服务器发送回显:

curl -s -i -X POST http://0.0.0.0:8001/whatsapp\
   -d '{"message":"Sample"}' -H "Content-Type: application/json"\
   --cookie cookie.txt --cookie-jar cookie.txt

它将始终获取最新消息并将其回显到控制台。


推荐阅读