我想知道是否有一种方法可以直接在两个(或更多)flask-socketio服务器之间进行通信.我希望在服务器之间传递信息,并让客户端连接单个Web套接字服务器,该服务器将具有来自其他服务器的所有组合逻辑和数据.
我在JS Socket IO Server to Server中找到了这个例子,解决方案是使用socket.io-client连接到另一台服务器.
我查看了Flask-SocketIO文档以及其他资源,但看起来Flask-SocketIO似乎没有客户端组件.
有什么建议或想法吗?
当我四处搜索时,这似乎是一个常见问题,但我似乎无法找到可行的解决方案。据我所知,该错误不是很有帮助,因为它并没有真正告诉您为什么保存的会话消失了。
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/eventlet/wsgi.py", line 481, in handle_one_response
result = self.application(self.environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/flask_socketio/__init__.py", line 37, in __call__
start_response)
File "/usr/local/lib/python2.7/dist-packages/engineio/middleware.py", line 47, in __call__
return self.engineio_app.handle_request(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/socketio/server.py", line 303, in handle_request
return self.eio.handle_request(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/engineio/server.py", line 226, in handle_request
environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/engineio/socket.py", line 79, in handle_get_request
start_response)
File "/usr/local/lib/python2.7/dist-packages/engineio/socket.py", line 118, in _upgrade_websocket
return ws(environ, start_response)
File "/usr/local/lib/python2.7/dist-packages/engineio/async_eventlet.py", line 13, in __call__ …Run Code Online (Sandbox Code Playgroud) 我有一个使用Flask和FlaskSocket.IO 2.8.4的应用程序。当我初始化SocketIO时,我正在使用
#[...]
logging.basicConfig(level=logging.DEBUG,format='[%(asctime)s][%(levelname)s] - %(funcName)s: %(message)s')
logger = logging.getLogger(__name__)
handler = logging.FileHandler(__builtin__.config['dir']['log_file_handler'])
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('[%(asctime)s][%(levelname)s] - %(funcName)s: %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
# Setting up flask external plugins
socketio = SocketIO(app, logger = False)
#[...]
if __name__ == '__main__':
socketio.run(app, port=8000)
Run Code Online (Sandbox Code Playgroud)
无论如何,我的日志中的输出有很多emit,receive和以下handle_event行:
[2017-04-19 05:17:02,172][INFO] - receive: 1139f764dbe64a1ba6e1c8d95228400c: Received packet MESSAGE data 2/telescope,["AskForTimeEvent"]
[2017-04-19 05:17:02,173][INFO] - _handle_event: received event "AskForTimeEvent" from 1139f764dbe64a1ba6e1c8d95228400c [/telescope]
[2017-04-19 05:17:02,173][INFO] - emit: emitting event "clockEvent" to all [/telescope]
[2017-04-19 05:17:02,174][INFO] …Run Code Online (Sandbox Code Playgroud) 您好,我正在尝试在 docker 容器中设置flask-socketio。它似乎可以运行,但是当我尝试访问端口 5000 上的 localhost 时出现错误(来自浏览器),就像我习惯使用 Flask 应用程序一样。它说:无法连接!
我将向您展示 5 个重要文件:Dockerfile、requirements.txt、docker-compose.yml、web_app.py 和 index.html
Dockerfile:
FROM python:3.6.5
WORKDIR /code
COPY * /code/
RUN pip install -r requirements.txt
Run Code Online (Sandbox Code Playgroud)
要求.txt:
Flask==1.0.2
Flask-SocketIO==3.0.1
eventlet==0.24.1
Run Code Online (Sandbox Code Playgroud)
docker-compose.yml:
version: "3"
services:
web:
build: ./web
ports:
- '5000:5000'
volumes:
- './web:/code'
Run Code Online (Sandbox Code Playgroud)
我使用命令 docker-compose up --build和docker-compose run web /bin/bash以交互模式进入这个容器。
web_app.py:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
@app.route('/')
def index():
return render_template('index.html')
@socketio.on('my …Run Code Online (Sandbox Code Playgroud) 我尝试了以下方法:
@socketio.on("signup req")
def signup_req(json):
print(f"Response! {json}")
socketio.emit("signup res", "RECEIVED!")
session["user"] = {"name": json["name"]}
Run Code Online (Sandbox Code Playgroud)
但是当我想通过以下方式访问它时:
@app.route('/')
def index():
...
print(session["user"])
...
Run Code Online (Sandbox Code Playgroud)
我会得到一个 KeyError,这意味着密钥没有存储在会话中。
当我为 SocketIO 运行烧瓶时,我在我的 cmd 上得到以下信息:
WARNING in __init__: Flask-SocketIO is Running under Werkzeug, WebSocket is not available.
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
我应该如何使用 SSL 将 app.run() 转换为 sockio.run() ?
我有下面的应用程序启动代码与 Flask 开发服务器一起运行
if __name__=='__main__':
app.run(ssl_context=(ssl_cert, ssl_key))
Run Code Online (Sandbox Code Playgroud)
我现在尝试使用 socketio 启动它,如下所示
if __name__=='__main__':
socketio.run(app, host='0.0.0.0', port=80, debug=True)
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚如何将证书传递到此调用中。
我需要做什么才能使这项工作成功?
有人可以解释一下 socket、socketio、flask socketio 与 python 的区别吗?为了使用这个带有颤动的套接字,我应该在后端编写什么代码?就像我应该写服务器和客户端还是只写客户端?
当我尝试从客户端向部署在应用引擎上的 socketio Flask 服务器发送请求时,我收到以下错误:
已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头。
我确实在我的 python 服务器脚本中添加了以下行:
socketio = SocketIO(app, cors_allowed_origins='*')
Run Code Online (Sandbox Code Playgroud)
我还添加了以下行:
CORS(app)
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我尝试使用 url 处理程序的 Allow_cors_origin 更改 app.yaml,安装flask-cors 包,但没有任何效果
编辑:我在调试时在应用引擎中发现以下消息:
{ "textPayload": "The client is using an unsupported version of the Socket.IO or Engine.IO protocols (further occurrences of this error will be logged with level INFO)", "insertId": "5fca5af900064b8faf6f9267", "resource": { "type": "gae_app", "labels": { "module_id": "default", "project_id": "island-battles", "version_id": "20201204t174848", "zone": "europe-west6-3" } }, "timestamp": "2020-12-04T15:51:21.412559Z", "labels": { "clone_id": "00c61b117cf0689fb08fabba9037f4624c77b480da8e9472be2b02038e0fe7d2d8dcac81021c" }, "logName": "projects/island-battles/logs/stderr", "receiveTimestamp": "2020-12-04T15:51:21.465294012Z" …
在部署网络应用程序方面,我有点菜鸟,并且想确保我正在构建的小应用程序能够与我尝试使用的技术配合使用。
我对 Flask 有一些经验,但只使用过测试服务器。我的理解是,使用 nginx 或 apache,如果我编写一个 Flask 应用程序,访问我网站的每个用户都可以获得 Flask 应用程序的不同实例,具体如何工作让我有点困惑。
我想要制作的应用程序类似于聊天室/类似“我们之间”的游戏。当用户访问该网站时,他们会加入一个大“大厅”,并且可以加入已经存在的“房间”,或者启动一个新房间并生成一个代码/ID,他们可以将其传递给他们的朋友,以便他们的朋友可以加入同一个会话(我认为可以使用 socketio“房间”)。
但是,如果每个客户端都连接到自己的 Flask 实例,那么每个服务器实例是否都能够看到其他实例上的“房间”?假设我的应用程序变得非常流行,并且我想将来在多台机器/AWS 实例上扩展大厅,我现在可以做些什么来确保它有效吗?或者就 Flask-socketio/nginx 堆栈而言,跨多台机器的扩展相当于跨单台机器上的实例的扩展。
基本上,我如何确保代码的大厅部分是可扩展的。我需要做些什么来确保每个用户都能够与其他用户连接到房间,即使他们获得了不同的 Flask 应用程序实例?
flask-socketio ×10
flask ×8
socket.io ×5
python ×4
eventlet ×2
docker ×1
flutter ×1
nginx ×1
python-2.7 ×1
python-3.x ×1
websocket ×1