We were early adopters shortly after the launch in October last year. We rapidly built and deployed a multi-page dashboard with reasonably flexible navigation using an extended version of the SessionState and rerun gists (instead of a single session state we use a stack of states, I posted this in the git issues board a while back). The key for us was wrapping that, page configuration loading, logging, and a template setup for the sidebar into a StreamlitPage class. All our pages subclass from this and navigation is implemented with a simple if … elif … dispatcher.
I rarely write a new page from scratch now. Usually I find the closest approximation and just modify the data handling and display. Calling the page’s rerun method when switching to another page after saving the current page’s state and next action is about all I have to remember.
This does rely on the two hacks, however those are almost totally wrapped in the base page class and I don’t anticipate any problems adapting to whatever approach Streamlit eventually adopt.
The release of components will further simplify the more complex cases. I just implemented a data annotator adapted from this and intend to modify it with the selectable DataFrame component, which should simplify it further.
All that said I have no experience with Flask (or other app builders) aside from a trivial web service with no UI. But we’ve been able to do pretty much everything we wanted for an end business user within the tool. We’ve no plans to change.