Plotly da sh кэширование на стороне сервера, зависящее от пользователя - PullRequest
0 голосов
/ 05 августа 2020

Я использую кеширование на стороне сервера в своем приложении dash, и я следовал примеру 4 в документации . Я использую это для запроса и обработки «глобальных» данных, этот подготовленный набор данных затем используется различными компонентами в приложении.

Я пытаюсь настроить пример так, чтобы кеширование также зависело и перезагружалось на некотором вводе пользователя.

Я пробовал с чем-то вроде ниже, что на самом деле не имеет смысла - как лучше всего достичь того, что мне нужно?

app = dash.Dash(__name__)

cache = Cache(app.server, config={
    'CACHE_TYPE': 'redis',
    'CACHE_TYPE': 'filesystem',
    'CACHE_DIR': 'cache-directory',
    'CACHE_THRESHOLD': 200
})

def get_dataframe(session_id, user_input_value):
    @cache.memoize()
    def query_and_serialize_data(session_id):
        df = # Here I make my query based on user_input_value 
             # If there is no input I just return an empty df
        return df.to_json()
    return pd.read_json(query_and_serialize_data(session_id))

def serve_layout():
    session_id = str(uuid.uuid4())

    return html.Div([
        html.Div(session_id, id='session-id', style={'display': 'none'}),
        # User input            
        # My output which doesn't behave as expected
    ])

app.layout = serve_layout

# Callback related to the user input

@app.callback(
    [
        Output('my-output', 'output-component')
    ],
    [
        Input('session-id', 'children'),
        Input('user-input', 'value')
    ]
)
def generate_output(session_id, user_input_value):
    df = get_dataframe(session_id, user_input_value)
    return # Output component

if __name__ == '__main__':
    app.run_server(debug=True)

1 Ответ

1 голос
/ 06 августа 2020

В опубликованном вами коде значение user_input_value никогда не достигает мемоизированной функции. Если вы измените свой код так, чтобы он выполнялся, то есть передайте user_input_value функции query_and_serialize_data, он должен работать как задумано

def get_dataframe(session_id, user_input_value):
    @cache.memoize()
    def query_and_serialize_data(session_id, user_input_value):
        df = # Here I make my query based on user_input_value 
             # If there is no input I just return an empty df
        return df.to_json()
    return pd.read_json(query_and_serialize_data(session_id, user_input_value))
...