#python #plotly-dash
Вопрос:
Я создал приложение dash, в котором мне нужно распечатать последние значения из базы данных. при извлечении данных он отображается в виде списка кортежей, поэтому мне нужно отформатировать его, чтобы напечатать данные, разделенные новой строкой. Я не смог достичь этого прямо сейчас с помощью своего кода. так что любые предложения будут очень полезны. Заранее спасибо.
Ниже приведен поток
Я получаю данные в виде списка кортежей [(2.27085, 2.73255,1.0),(2.27085, 2.73255,2.0),(2.27085, 2.73255,3.0)]
, у меня есть метки для каждого значения в кортеже ['value1', 'value2', 'SNO']
Я объединяю их, чтобы создать словарь, который приведет к чему-то вроде этого "{'value1': 2.27085, 'value2': 2.73255, 'SNO': 1.0}
затем я преобразую словарь в строку, чтобы удалить из него { }.
затем я объединяю все строки вместе, добавляя новую строку в конце каждой строки вместе с меткой времени, поэтому, когда я печатаю в приложении, это должно выглядеть так
21:40:41
'value1': 2.27085, 'value2': 2.73255, 'SNO': 1.0
'value1': 2.27085, 'value2': 2.73255, 'SNO': 2.0
'value1': 2.27085, 'value2': 2.73255, 'SNO': 3.0
вместо этого я получаю это в своем приложении dash
21:51:12
'value1': 2.27085, 'value2': 2.73255, 'SNO': 1.0Br(None)'value1': 2.27085, 'value2': 2.73255, 'SNO': 2.0Br(None)'value1': 2.27085, 'value2': 2.73255, 'SNO': 3.0Br(None)
вот код, который я попробовал
import datetime
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output, State
from app import app
printing = html.P(['CONSOLE', html.Br()])
app.layout = html.Div([
html.Div([
dcc.Interval(id="interval", interval=0.9 * 1000, n_intervals=0),
html.Div(id="content"),
])
])
def flask_logger():
log_mssg = ''
values = [(2.27085, 2.73255, 1.0), (2.27085, 2.73255, 2.0), (2.27085, 2.73255, 3.0)]
col_name_list = ['value1', 'value2', 'SNO']
current_time = datetime.datetime.now().strftime('%H:%M:%S')
if (values is not None and len(values) != 0) and (col_name_list is not None and len(col_name_list) != 0):
for i in values:
#concatenate the strings together with a new line at the end
log_mssg = log_mssg str(dict(zip(col_name_list, i))) str(html.Br())
log_mssg = log_mssg.replace('{', '')
log_mssg = log_mssg.replace('}', '')
current_time = [current_time] [html.Br()] [log_mssg]
#print(current_time)
return current_time
return 'none'
@app.callback(
Output("content", "children"),
Input("interval", "n_intervals"),
State("content", "children"),
)
def update_output(interval, content):
if not content:
return ['']
x = flask_logger()
return content x [html.Br()]
if __name__ == "__main__":
app.run_server(debug=True)
К вашему сведению, я удалил часть базы данных и добавил некоторые данные, имитирующие действие, чтобы любой мог запустить код напрямую.
Комментарии:
1. Могу ли я использовать формат JSON здесь?
Ответ №1:
Всякий раз, когда я хочу вернуть итерацию с каждым элементом в отдельной строке, я использую html.P()
. Чтобы вы могли переписать свою flask_logger
функцию для использования:
...
if (values is not None and len(values) != 0) and (col_name_list is not None and len(col_name_list) != 0):
log_mssg = [html.P(log_mssg str(dict(zip(col_name_list, i))).replace('{', '').replace('}', '')) for i in values]
current_time = [html.P(current_time)] log_mssg
...
Комментарии:
1. Это полностью работает, но я получаю сообщение об ошибке после запуска скрипта в течение некоторого времени, в котором говорится
dash_renderer.v1_9_1…140379.dev.js:93348 POST http://127.0.0.1:8050/_dash-update-component net::ERR_CONNECTION_TIMED_OUT
, а также подробно[Violation] 'setInterval' handler took 350ms
излагается любая идея, почему это происходит2. Я не уверен, но это как-то связано с вашим dcc. Компонент интервала. Возможно, документация на dash.plotly.com/dash-core-components/interval будет полезно. Если нет, то, возможно, это просто как-то связано с тем, что ваш локальный хост по какой-то причине отключился. Если вы сможете развернуть его и протестировать там, мы могли бы узнать больше.