数据插入数据库后触发 Socket 事件

Emit Socket event after data inserted in database

所以我正在开发一个聊天应用程序。 当新用户注册时,a 上的其他用户应该会在不刷新的情况下收到通知。

所以我制作了一个表单,每当用户注册时,我都会使用套接字发送用户名。我检查用户是否在数据库中,然后将用户信息发送到另一个页面。

$("#submit").click(function(){    
    socket.emit("register",$(".username").val())
})

问题是数据插入数据库需要时间,然后执行发出事件,我总是检查新用户是否在数据库中 returns none。

@socketio.on('register')
def test_connect(data):
    user = Detail.query.filter_by(username=data).first()
    print(user) # this always return none and emit event doesn't take place
    if user:
        emit("regis",user.username,broadcast=True ,include_self=False)

这里是注册函数的相关部分,我在其中验证表单并插入数据。

form = RegistrationForm()
if request.method=="POST" and form.validate_on_submit():
    user = Detail(username=form.username.data,email=form.email.data,password=form.password.data)
    db.session.add(user)
    db.session.commit()
    return redirect("/signin")

有没有一种方法可以确保仅当 if request.method=="POST" and form.validate_on_submit(): returns 为真时才发生 emit 事件,以便将数据插入数据库并在 emit 事件发生之后发生。

我试过使用这个 question 在路由中发射,但它似乎不起作用,函数 socket.io 没有执行。

我们将不胜感激任何建议。

@miguel 感谢您的回复,是的,它是异步的。这是基本的登录表单,当用户注册时,页面重定向到登录页面,用户断开连接。

我认为回调不会在页面重定向到其他页面时起作用。

但是,我找到了在路由中发出事件的解决方案。

我在 register 路由中提交数据库后使用了它。

socketio.on_event('register', test_connect(user.username),namespace="/")

然后我定义了test_connect函数。

def test_connect(data):
    emit("regis",data,broadcast=True  ,namespace="/")

这对我有用,但如 docs 中所述。

For cases when a decorator syntax isn’t convenient, the on_event method can be used:

def my_function_handler(data):
    pass

socketio.on_event('my event', my_function_handler, namespace='/test')

当我只使用socketio.on_event('register', test_connect ,namespace="/")时,emit事件test_connect函数没有被执行

所以我需要调用这个函数并给它一个参数让它工作。 我不知道为什么它不起作用,没有错误。

但是我的代码运行良好。