数据插入数据库后触发 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函数没有被执行
所以我需要调用这个函数并给它一个参数让它工作。
我不知道为什么它不起作用,没有错误。
但是我的代码运行良好。
所以我正在开发一个聊天应用程序。 当新用户注册时,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函数没有被执行
所以我需要调用这个函数并给它一个参数让它工作。 我不知道为什么它不起作用,没有错误。
但是我的代码运行良好。