Repository navigation
Dev Mode Config Settings #383
Copy link
Copy link
Closed
Description
I wanted to kick off a quick discussion about how we deal with dev mode settings. We've got a few PRs open that introduce new dev mode features and I want to make sure that we have the right abstraction in place.
For context, please read the thread from #369 (comment) and the "debug, dev, production" section in this issue: #312 and an issue by one of the flask developers about running debug mode: #16
Requirements:
- We minimize the risk that users run these features that have security implications accidentally in production mode
- See Do not encourage Flask.run in production #16 for a discussion on this. This is why we made
debug=Falsethe default behaviour while including
in all of our examples.if __name__ == '__main__': app.run_server(debug=True)
- See Do not encourage Flask.run in production #16 for a discussion on this. This is why we made
- We allow users to turn on wsgi-compatible features if they are using gunicorn in their dev environment
- This means that we can't just stick these features in
run_serverasgunicornwon't userun_server - In Add unminified components bundle support. #369, there was a suggestion to make a separate method that
run_servercalls (enable_dev_mode). That way, users using gunicorn in their dev env can just call this function
- This means that we can't just stick these features in
- There is a simple flag to turn on and off all of the dev mode features. Additionally a way to turn individual features on and off (e.g. turn off hotloading but turn on sourcemaps)
- For users using
run_serveras a dev environment, they shouldn't have to change their code before deploying it to the dev environment.- This means that these settings can not live in the constructor like the rest of the dash arguments.
- This limits us to either having them as part of
run_serveror as an env variable.envvariable is too hard for our users.
With these constraints, the only solution that I see is:
- The
debug=Truecommand inapp.run_server(debug=True)ends up doing two things:- Passes
debug=Trueintoflask.run(debug=True)for auto-reloading - Calls
app.set_debug_mode(debug=True)
- Passes
- Each dev mode feature that we write gets its own additional setting that's prefixed with
debug_:debug_flask=True- This is the setting that allows users to turn on/off flask's debug environment (i.e.app.server.run(debug=debug_flask)). This would include auto-reloading and the werkzeug debugger.debug_javascript_bundles=True- This turns on/off the source maps/unminified bundles Add unminified components bundle support. #369debug_hot_reload=True- This turns on/off hot reloading. Ifdebug_hot_reload=Truebutdebug_flask=False, then an error is raised (because we need flask's autodebugger - right?)debug_display_javascript_errors=True- This turns on/off displaying the JS error messages in the front-end app (bubbling the error messages up from the browser console to the app) [WIP] Dash dev tools dash-renderer#64debug_display_python_debugger=True- This turns on/off displaying the python debugger in the browser context and highlighting the error messages ([WIP] Dash dev tools dash-renderer#64). Ifdebug_display_python_debugger=Truebutdebug_flask=False, then an error is raised (because we need flask's autodebugger - right?)debug_display_callback_dag=True- This turns on/off the graph of the callback visualdebug_hide_url_route_logs=True- This turns on the HTTP request logging (and we turn it off by default) - remove werkzeug url print statements by default? #382
- dash-renderer may need some of these settings. So, they'll get serialized like the rest of the config settings: as an element in Dash's JSON config element (
<script id="_dash-config">{...}</script>or w/e)
Drawbacks:
- Because of Do not encourage Flask.run in production #16, technically, these aren't on by default. However, all of our examples use
app.run_server(debug=True)and I instinctively write this whenever I create an app, so it's practically the default option. - Previously,
debug=Truewas 1-1 with flask'sapp.server.run(debug=True). Now,debug=Truewill set many other settings. This is OK, if a user needs to turn this off but they want something else on, they can do something like:app.run_server(debug=False, debug_javascript_bundles=True)orapp.run_server(debug=True, debug_flask=False)
Naming:
- I think these names should be read as "Debug mode: " rather than "Debug ". That is, instead of
debug_javascript(which reads as "Debug javascript"), we'd have more specificdebug_server_dev_javascript(which reads as "Debug mode: Serve dev javascript"). - That is, these settings should be tightly integrated with the underlying the feature, allowing users to turn on and off any particular feature.
Does this sound right @plotly/dash ? Sorry for holding things up here, but I want to make sure that we're laying down the right foundation 🚧
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
chriddyp commentedon Sep 12, 2018
Just to be precise, this is what I imagine
run_serverandset_debug_modelooking like:T4rk1n commentedon Sep 13, 2018
I don't like relying on kwargs that much, it tends to hide options to the users. Like the only time you gonna get auto-completion for the kwargs is in
__init__subclass. Making them explicit doesn't take much more work here.@chriddyp
In #369, I prefixed the variables with
dev_tools_, here I seedebug_, can we get fixed on the naming ? I likeddev_toolssince it was different than thedebugkeyword of flask but I don't mind changing it.chriddyp commentedon Sep 13, 2018
Here's what it would look like with
dev_toolsand the kwargs expanded:chriddyp commentedon Sep 13, 2018
I like
dev_toolstoo. One thing that I like about thedebug_prefix is that I think it's clearer thatdebugis the default value for the rest of the dev tool settings. That is, ifdev_tools_serve_dev_javascript is None, then it gets set to whateverdebugis.That being said, I do like the sound of
dev_toolsbetter thandebug.chriddyp commentedon Sep 13, 2018
I'd like to make sure that we have consensus among @ned2 and @rmarren1 as well
rmarren1 commentedon Sep 14, 2018
Some comments on the dev tools flags:
dev_tools_display_javascript_errorsturn ondev_tools_serve_dev_javascriptby default?dev_tools_debuggershould readdev_tools_display_python_errors. That way, it matchesdev_tools_display_javascript_errorsand it is clear they are related. Or perhaps both should be changed todev_tools_display_backend_errorsanddev_tools_display_frontend_errors.rmarren1 commentedon Sep 14, 2018
Also, I thinkdebugshould over-ridedev_tools_debuggerand not the other way around. Just because people should be usinggunicornin production doesn't mean they will, so this could be a safety net for people who just flipdebug=Falseand runpython app.pyon an EC2 instance thinking they are safe.Ah, I see this is a mechanism to turn on everything or only turn certain debug options. Guess we just need people to be careful.
rmarren1 commentedon Sep 14, 2018
Also, what is the best way to go about rolling this out? Should we add the config options in each PR as we merge them, or add them all at once and have the un-implemented ones do nothing?
T4rk1n commentedon Sep 14, 2018
Yes it should be activated.
#369 is almost done and I added a
enable_dev_toolsmethod, just waiting for the consensus on the variable naming. Let's get that in first then we can rebase and add support in the ongoing PRs.chriddyp commentedon Sep 14, 2018
Yeah, let's implement them one-by-one. I just want to make sure that we agree on:
debug➡️ overriding other, unspecifieddev_tools_*flagsdev_tools_prefix for all of these settingsenable_dev_toolsmethod name and behaviourapp.run_serverand not indash.Dash.Once we have consensus (add 👍 if you are OK with 1-4), we can introduce this pattern in our new PRs, one-by-one.
ned2 commentedon Sep 17, 2018
Nice. I reckon this sounds like a solid foundation for building out dev-mode features on top of. Was definitely worth pausing to think about this.
chriddyp commentedon Sep 17, 2018
Excellent, thanks for chiming in everyone. I'll close this down now that we have consensus 👍
treat `dev_tools_ui` like the other `dev_tools_*` parmeters
Fix merge conflicts in PR-201 (plotly#383)