GibbsConsulting / django-plotly-dash

Expose plotly dash apps as django tags
MIT License
554 stars 125 forks source link

How to query database and pass it to the `plotly_app` #498

Open jsulopzs opened 6 months ago

jsulopzs commented 6 months ago

Goal

I am trying to render a Dash app through a template that takes input from the view after calling the URL (that's how Django works).

The main problem I face is how to pass data through this logic.

Context

Implementation

I am considering two strategies:

  1. Query the database from the view through the model and cache it
  2. Get the data.csv from an s3 path s3://domain.com/projects/<id_project>

With option 1, I am stuck on the concept of passing the data. All I have found online concerns the state, but I don't want to use the state because the full dataset of the id_project (~20MB) should be available during the session.

With option 2, I am stuck on passing the id_project from the view to the template captured within the Dash app.

Beyond solving these doubts, any new approaches are welcomed

Thanks in advance for the help!

GibbsConsulting commented 5 months ago

@jsulopzs if you have a lot of data, then one strategy is to manage the data within Django (eg as part of the ORM, or leveraging a cache) and then accessing it during (extended) callbacks.

jsulopzs commented 5 months ago

Thanks for the response @GibbsConsulting. I'll take the caching approach using Redis and call the id_project from the user's dropdown selection.

Although I see a caveat:

To pass the id_project options in the dropdown, I need only to display the ones associated with the logged-in username.

I am passing the username through initial_arguments, but I wouldn't say it's a safe approach since any user can inspect the HTML and change the username value to access anyone's project.

hetryn commented 5 months ago

Would the view decorator @login_required prevent unauthorized access in the case of using initial_arguments?

see: https://django-plotly-dash.readthedocs.io/en/latest/access_control.html