-
-
Notifications
You must be signed in to change notification settings - Fork 142
Ability to choose partial plotly.js bundles #462
Description
Great library 💃 One small improvement 💡 : Currently dcc is shipped with the full plotly.min.js bundle. Do you see an easy/elegant way of enabling the user to specify one of the partial plotly.js bundles, and let e.g. the full bundle be the default?
I currently see two use cases:
- Reduced size (full
plotly.min.js2.8 MB, while e.g.plotly.cartesian.js, covering many applications, is 0.9 MB). - Make it possible to enforce a strong CSP configuration (useful for applications where increased security is wanted).
Regarding 2), Dash alone works beautifully with a strong CSP configuration. You can e.g. do
pip install dash dash_html_components dash_core_components flask-talisman
and then run
import dash
import dash_html_components as html
import dash_core_components as dcc
from flask_talisman import Talisman
app = dash.Dash(__name__)
app.css.config.serve_locally = True
app.scripts.config.serve_locally = True
csp = {
'default-src': '\'self\'',
'prefetch-src': '\'self\'',
#'script-src': ['\'self\'', '\'unsafe-eval\''], # [1]
#'style-src': ['\'self\'', '\'unsafe-inline\''], # [2]
'navigate-to': '\'self\'',
'base-uri': '\'self\'',
'form-action': '\'self\'',
'frame-ancestors': '\'none\'',
'object-src': '\'none\''
}
# [1]: https://github.com/plotly/plotly.js/issues/897
# [2]: https://github.com/plotly/plotly.js/issues/2355
Talisman(app.server, content_security_policy=csp, force_https=False)
app.layout = html.Div(children=['Hello Dash!'])
#app.layout = html.Div(children=['Hello Dash!', dcc.Graph()])
if __name__ == '__main__':
app.run_server(host='localhost')This works beautifully in Dash.
However if dcc.Graph() is added to app.layout you will in the browser get "Error loading dependencies" due to violation of CSP directives script-src and style-src (these comes from plotly/plotly.js#897 and plotly/plotly.js#2355 respectively).
This can be "solved" by adding unsafe-eval and unsafe-inline, but the script-src part can be solved in a safer way by using one of the partial bundles of plotly.js instead, for applications where you don't need gl3d and gl2d.
I quickly tested overwriting the [...]/lib/python3.7/site-packages/dash_core_components/plotly[...].min.js installed in the environment with one of the partial plotly.js bundles, and that enabled (as expected) a stricter CSP without opening for eval() and its relatives.