是否可以从烧瓶中的 socketio 获取用户代理信息?我猜用户相关信息会在握手期间发送到套接字服务器。
如果不可能,我将要求客户手动发送此信息。
如何在flask socket io中发送个人消息?我有关于 request.sid 的提示,但我不知道如何获取我发送消息的人的 request.sid?我如何为发送方和接收方分配一个公共房间?
if user_exist:
@socketio.on('private message', namespace='/message/')
def join(msg):
join_room(request.sid)
room = request.sid
emit("my response",{ "data" : msg['data'] },room=room)
Run Code Online (Sandbox Code Playgroud)
这里的 request.sid 指的是发送者的 sid 而不是接收者的 sid,那么我该如何分配他们两个同一个房间呢?
我正在尝试创建一个可以从服务器向客户端发送消息的python应用程序.目前我使用此示例代码在这里.这是一个聊天应用程序,它工作正常.我试图修改应用程序并在服务器端python代码中添加一个新函数,它将向客户端打印消息"Dummy",但似乎它不起作用.
这是我的HTML代码:
的index.html
<body>
<ul id="messages"></ul>
<ul id="output"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script src="{{url_for('static', filename='assets/vendor/socket.io.min.js')}}"></script>
<script src="{{url_for('static', filename='assets/vendor/jquery.js')}}"></script>
<script>
var socket = io.connect('http://127.0.0.1:5000/chat');
$('form').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').html($('<li>').text(msg));
});
socket.on('output', function(msg){
alert(msg)
$('#messages').html($('<li>').text(msg));
});
</script>
Run Code Online (Sandbox Code Playgroud)
这是我的后端代码:
web_app.py
from flask import Flask
from flask import render_template
from flask_socketio import SocketIO
from flask_socketio import emit
app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)
connected = False
def socket_onload(json):
socketio.emit('output', …Run Code Online (Sandbox Code Playgroud) 我已经开始使用带有Eventlet的Python中的Flask SocketIO进行大量工作,并且正在寻找一种处理并发请求/线程的解决方案.我已经看到gevent可以实现,但是如果我使用eventlet怎么办呢?
我正在使用 Flask、Flask-Socketio 和 Flask-SQLAlchemy 创建实时报告应用程序。我当前的设计在连接上创建一个后台线程,用于查询 API 并插入到应用程序数据中。但是,当运行这个时,我收到错误
RuntimeError: No application found. Either work inside a view function or push an application context.
Flask_react_app.py:
from threading import Lock
from flask import Blueprint, render_template
from .model import Stock
from . import socketio
main = Blueprint('main', __name__)
thread_lock = Lock()
thread = None
@main.route('/')
def index():
"""Serve client-side application."""
return render_template('index.html', async_mode=socketio.async_mode)
def generate_data():
"""
returns the Stock object query set
"""
return [i.serialize for i in Stock.query.all()]
def background_thread():
"""Example of how …Run Code Online (Sandbox Code Playgroud) 我想将Flask-SocketIO与我的Flask项目集成。我的应用程序在 Nginx 反向代理后面运行:
location /plivo_api{
rewrite ^/plivo_api(.*) /$1 break;
proxy_pass http://127.0.0.1:8090;
}
Run Code Online (Sandbox Code Playgroud)
所以我不明白/plivo_api 中收到的所有流量都将被重写为“/”端口8090。这部分工作得很好。
当我想连接到套接字时,问题就开始了。直接连接到socket没有问题。
# all those examples work
# from localhost
var socket = io.connect()
var socket = io.connect('http://localhost:8090/')
# running the app out of the reverse proxy
var socket = io.connect('http://my_server:8090/')
Run Code Online (Sandbox Code Playgroud)
但是通过 Nginx 我无法连接
# Bad Gateway
var socket = io.connect('http://my_server/plivo_api')
Run Code Online (Sandbox Code Playgroud)
问题是我是否缺少连接到我的 socketio 应用程序的东西,或者还有一些额外的东西要添加到 Nginx 配置中?
与 socketio 集成的烧瓶应用程序代码看起来像
# this code work well, …Run Code Online (Sandbox Code Playgroud) 我正在使用 socketio 运行 Flask 应用程序来处理通知。Flask 应用程序正在侦听端口 5000,而客户端在 8080。
js 客户端总是收到这个错误:
VM15520:1 GET http://localhost:5000/socket.io/?EIO=3&transport=polling&t=Mb2_LpO 400 (Bad Request)
Access to XMLHttpRequest at 'http://localhost:5000/socket.io/?EIO=3&transport=polling&t=Mb2_LpO' from origin 'http://localhost:8080' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)
我实际上是用 gunicorn 启动我的应用程序的,如下所示:
gunicorn --workers=1 --worker-class eventlet --certfile=keys/key.crt --keyfile=keys/key.key --bind 0.0.0.0:5000 myapp.run:app
Run Code Online (Sandbox Code Playgroud)
这是我的 run.py:
import eventlet
from myapp import create_app
eventlet.monkey_patch()
app, celery = create_app('config_prod.py')
Run Code Online (Sandbox Code Playgroud)
我也在我的应用工厂中使用 CORS(app)。
我还尝试将其添加到我的一张蓝图中:
@api.after_request
def after_request(response):
response.headers.add('Access-Control-Allow-Origin', 'http://localhost:8080')
response.headers.add('Access-Control-Allow-Headers',
'Origin, X-Requested-With, Content-Type, Accept, Authorization')
response.headers.add('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS') …Run Code Online (Sandbox Code Playgroud) 在我使用Flask构建的网站中,人们可以互相发送PM.当用户收到pm时,我现在想要实现类似于StackOverflow的通知.由于SO使用websockets实现了这一点,我使用本教程开始使用websockets来实现Flask-socketIO(适用于Socket.io).
我下载了教程制作的示例,我理解其中的代码.但我不明白的是:
所以,假设我有一个简单的路由,人们可以将PM发布给另一个用户:
@app.route('/admin/pm', methods=['GET', 'POST'])
@login_required
def pms():
if request.method == 'POST':
savePM(g.user.id, request.form['toUserId'], request.form['text'])
# How do I emit a message here to the user to whom this message is sent?
return render_template('sendPM.html')
Run Code Online (Sandbox Code Playgroud)
我的评论已经说明了:如何向该用户发送此消息的用户发送消息?欢迎所有提示!
[编辑]按照Miguel的提示,我想到创建一个名为的房间user.id,所以我现在创建了以下连接和断开事件:
@socketio.on('connect', namespace='/test')
@login_required
def websocketConnect():
join_room(g.user.id)
emit('my response', {'data': 'Connected'}, room=g.user.id)
@socketio.on('disconnect', namespace='/test')
@login_required
def websocketDisconnect():
leave_room(g.user.id)
print('Client disconnected')
Run Code Online (Sandbox Code Playgroud)
但在连接时,我得到下面的堆栈跟踪.是不是g用socketio路由创建了对象?
Traceback (most recent call last):
File "/Library/Python/2.7/site-packages/gevent/greenlet.py", …Run Code Online (Sandbox Code Playgroud) 我有一个用 编写的基本 websocket 服务器应用程序Flask-SocketIO,位于 AWS 中的 NGINX 后面。我可以使用 Web 客户端(Chrome 和 FFox)成功连接到它,但它一直使用轮询而不是 Web 套接字。测试时,我一遍又一遍地在控制台中看到如下消息:
127.0.0.1 - - [2018-04-27 11:59:43] "GET /socket.io/?token=1234567890qwertyuiop&EIO=3&transport=polling&t=1524830363623-23&sid=c4606e25c4603e23&sid=c4606e2f18c403e24b160d16c50a16c50c50d12f10d12f9d1234567890qwertyuiop&EIO=3
经过一番研究,我在客户端连接选项中添加了“rememberTransport:false”,但这并没有帮助,所以大概是我的代码或配置有问题。我希望有人能够发现我犯的一个明显的(菜鸟)错误。
我更改了我的 AWS 安全组,这样我就可以绕过 NGINX 并直接访问测试 WSGI 服务器。所以现在我在本地 PC 上使用http://serverIP:5000。我仍然遇到同样的问题,所以它与 NGINX 配置无关。
我只是将示例代码复制到我的 RPi3B 并在那里运行服务器。我的三星手机浏览器、PC FFox、PC Chrome 和 RPi Chromium 都会导致轮询连接。所以看起来问题出在 Flask-SocketIO 服务器上。我的代码非常简单,那么有什么问题呢?
我的服务器代码如下:
#!/usr/bin/env python
from flask_socketio import SocketIO, join_room, send, emit, disconnect
from flask import Flask, render_template, request
robotAIapp = Flask(__name__)
socketio = SocketIO(robotAIapp)
@robotAIapp.route('/wsLogin.html')
def wsLogin():
return render_template('wsLogin.html')
@socketio.on('connect')
def …Run Code Online (Sandbox Code Playgroud) flask-socketio ×10
flask ×8
python ×8
socket.io ×4
nginx ×2
websocket ×2
eventlet ×1
python-3.x ×1
webserver ×1