在Dash中实现一个控制台,该控制台会根据服务器上中间步骤的状态进行更新



我所拥有的:基本上,我在Python的Dash中有一个面板,它有一个名为GetData的按钮。这个按钮的回调处理程序从3个来源获取数据,绘制3个图表,并发送回一个输出Div,很好地包装了所有这些图表。我在客户端屏幕上还有一个文本区域,它在服务器上完成所有工作后进行更新,用作控制台。

我想要什么:

客户端屏幕上的专用区域,用于保存客户端在服务器上启动的操作的运行日志。这意味着,

a( 我想通过在服务器上附加中间步骤的状态来更新控制台中的文本。在我看来,我只能更新文本区域ONCE中的值,就在按钮回调处理程序的末尾。b( 我还想将这个控制台作为输出绑定到多个按钮回调,这样我就可以将服务器上发生的事情的日志和客户端的请求一起发送回客户端。

想法?

我能够通过实现这一点

a( 写入日志文件
b(使用dcc。间隔组件,输出绑定到一个文本区域,该文本区域轮询日志文件并显示日志文件的最后20行

到目前为止,只有一个用户/客户端,但一旦有了更多用户/客户端就需要考虑过滤等问题。

对于这种用例,我通常使用以下方法的变体

  1. 为每个日志实例生成一个唯一的密钥,例如,如果您想要当前用户的所有日志,您可以使用页面加载时生成的会话id或GUID
  2. 在服务器上执行回调期间,日志输出被写入由键标识的服务器端资源(redis缓存、文件等(
  3. 使用由Interval组件触发的回调,并使用密钥State(以便可以识别正确的日志(,从服务器读取日志

我不确定这是否能完成任务,但您可以在回调之前构造一个日志装饰器,如下所示:

@callback(...)
@myLogger
def function(a, b, c):
pass
def myLogger(fn):
@wraps    
def wrapper(*args, **kwargs)
code_info = fn.__code__
code_vars = fn.__code__.co_names ## There are many options here
## check fn.__code__.__dict__ 
## in repl
retval = fn(args, kwargs)
print(f"func: {fn.__name__}, args: {args}, kwargs: {kwargs}, retval: {retval}")
return retval
return wrapper

以上或多或少是函数装饰器的psudo代码,它可以从用它装饰的函数调用中提取信息。它从函数中查询代码对象,评估函数,将信息集合打印到终端,并像正常情况一样返回输出。请注意,myLogger位于回调之后,因为我们希望按照以下组成函数

callback(myLogger(function(...)))

相关内容

最新更新