创建标签存储前的连接处理器
说明
non-handshake'通过client.handle-handshake(.)'援引连接处理器,而仅*在等待create tab storage'(nicegui/nicegui.py:220-223')。 在标签上第一握手时,还没有“@tabs”条目,所以一个sync连接处理器在条目存在之前就进行内线运行,“app.storage.tab”则进行自己的断言。 安全invoke ' 抓住了它,因此,页上仍然放出——其余的处理者被跳过,唯一的痕迹是记录了错误。 (重新连接很好:复制-tab ' 运行较早,使用`` tabs'。 )
一个async 处理器被安排为任务,等待后着陆,所以它起作用了. 同样的API,同样的处理器体,相反的结果取决于def' vsasync def';app.on-connect'/client.on-connect'的文件中没有任何内容提到这一点。 文件所记载的`await ui.context.client.connected ()'模式也是安全的,这可能是为什么这一点没有引起注意。
独立于#6310——这个只有"空中",这是当地的"Socket". IO路径. #6332的镜像将"On-handshake"打入"air.py",因此它继承了同一种命令.
示例代码
从好Gui导入应用程序, ii
@ui.page ('/') (中文(简体) ).
daf 指数( ):
ui.context.client.on connect(lambda: app.storage.tab. set item ('x', 1)) (中文(简体) ).
ii. label( 你好)
如果 name 在{ main ', “ mp main }} 中为 :
ui.run( 存储 ssecret='x')页面生成; 服务器日志显示 :
错误的 nicegui: app. py: 187 标签存储, 用于 3b199ba2... 在访问它之前应该创建 。
文件"nicegui/client.py", 第463行, 在 safe invoke
文件"nicegui/ storage.py", 第177行, 在标签中
Assertion Error: 3b199ba2 的标签存储器... 在访问它之前应该创建 。< 细节> < summary-> 四种变体, 1 run </ summary>
client.on connect (sync) FAIL: 为<id> 创建标签存储后, 才能访问它
app.on 连接(同步) FAIL: 相同
client.on connect (async) 确定
等待客户端.已连接() OK所有四个都通过 " 用户 " 固定测量;同步大小写通过真正的浏览器握手与 " 屏幕 " 固定重现(上面的回溯来自该跑道)。 清理出"0e666fd9"主机,与"#6332"分机的字节同用,因此两地都没有引入.
随着redis url'的设定,两行OK ' 都回避这一说法,但并不完全安全:create tab storage'在storage.py:184'安装了此命令,然后才在tab.nirstize()'在:187'等待`tab.nirstize()',这样复职的服务员就可以达到未装入的命令。
</详情>
- 可能的固定
处理者运行前创建标签存储 。 在Redis(创建 tab storage " 产量)和 " handle handshake " 下进行生命周期记账(口袋登记、取消删除任务、连接计数),不应拖延。 所以拆分是记账先行,存储后行,处理者引用后行. 将共享的顺序折叠成一个"Client"方法——从第6279号取出或取出,再于第6310号取出—— . . . . . . .
内容来源: zauberzeug/nicegui