发生 websocket 连接时会话变量值未更新 - Python
Session variable value is not updated when websocket connection happens - Python
我正在创建一个 API 以将消息发送到 echo 服务器
为此,我使用来自此站点 https://www.websocket.org/echo.html 的回声聊天服务器 URL ws://echo.websocket.org/。此连接将回应我们的输入。
当用户第一次请求API时,我需要与回显服务器建立连接并将用户消息发送到回显服务器。当第二次用户请求相同的 API 时,这次连接已经建立。所以,我只需要将用户消息发送到回显服务器。
为此,我使用 python 会话来存储连接详细信息。第一次建立连接时,我试图将其保存在会话中。 session['ConnetionMade'] = "True"
默认为false
因此,当用户第二次请求 API 时,这次 ConnetionMade 为 True。所以,我不会再联系了。
但是这里的session变量并没有在建立连接的时候更新。它总是错误的。但是我们设置为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'])
在你的例子中,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
它将始终获取最新的消息并将其回显到控制台。
我正在创建一个 API 以将消息发送到 echo 服务器
为此,我使用来自此站点 https://www.websocket.org/echo.html 的回声聊天服务器 URL ws://echo.websocket.org/。此连接将回应我们的输入。
当用户第一次请求API时,我需要与回显服务器建立连接并将用户消息发送到回显服务器。当第二次用户请求相同的 API 时,这次连接已经建立。所以,我只需要将用户消息发送到回显服务器。
为此,我使用 python 会话来存储连接详细信息。第一次建立连接时,我试图将其保存在会话中。 session['ConnetionMade'] = "True"
默认为false
因此,当用户第二次请求 API 时,这次 ConnetionMade 为 True。所以,我不会再联系了。
但是这里的session变量并没有在建立连接的时候更新。它总是错误的。但是我们设置为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'])
在你的例子中,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
它将始终获取最新的消息并将其回显到控制台。