Python 在Dash中实现一个控制台,该控制台将更新服务器上中间步骤的状态

Python 在Dash中实现一个控制台,该控制台将更新服务器上中间步骤的状态,python,callback,dashboard,plotly-dash,Python,Callback,Dashboard,Plotly Dash,我拥有的:基本上我在Python的Dash中有一个仪表板,它有一个名为GetData的按钮。此按钮的回调处理程序从3个源获取数据,绘制3个图表,并发回一个输出Div,很好地包装了所有这些图表。我在客户端的屏幕上还有一个文本区域,在服务器上完成所有工作后更新,作为控制台 我想要的是: 客户端屏幕上的专用区域,用于保存客户端在服务器上启动的操作的运行日志。这就意味着, a) 我想通过在服务器上附加中间步骤的状态来更新控制台中的文本。在我看来,我只能更新文本区域中的值一次,就在按钮回调处理程序的末尾。

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

我想要的是:

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

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


想法?

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

@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(...)))

我是通过

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


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

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

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

  • 请用问题的形式表达你的问题。你刚刚说了你想要什么。向我们展示您迄今为止的代码,并解释当前的尝试如何未能满足您的要求。我询问了人们的想法,得到了一些好的想法。我们注意到您对本次讨论的贡献(其价值值得商榷)。如果可以的话,请善待新用户。如果我被认为不礼貌,我道歉。我只是想帮忙。新用户的一个常见错误是问一个问题,说“我正在努力做到这一点”,但不说“这就是我遇到的问题”。当询问者指定问题所在时,提供帮助更容易。欢迎来到这个网站。