python - 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'])
解决方案
在您的情况下,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
它将始终获取最新消息并将其回显到控制台。
推荐阅读
- html - 如何使用数据选择为项目添加颜色
- java - 即使我启用了按钮,它也默认被禁用
- php - Laravel Virgin:在测试利用关系的模型修改器时禁用/模拟数据库连接
- android - 我无法通过 FAB 从主要活动开始活动或片段
- python - 激活 conda 环境后如何仍然使用 anaconda Python3?
- mobile - Katalon iOS 移动自动化,是否可以制作自定义关键字,长按和移动元素(拖放)
- php - 如何解密使用 Openssl 在 bash 脚本中加密的 PHP 文件
- angular - 获取选择一个菜单的默认值
- postgresql - 为什么会出现“架构验证:缺少序列 [SEQ_BANDO]”错误?
- c# - Firebase 查询方法对我不起作用,我似乎找不到任何方法