plotly / dash

Data Apps & Dashboards for Python. No JavaScript Required.
https://plotly.com/dash
MIT License
21.22k stars 2.05k forks source link

do not crash on syntax errors #459

Open nicolaskruchten opened 5 years ago

nicolaskruchten commented 5 years ago

Right now if I have an app running and I change the Python source, it reloads, and with client-side hot-reloading the experience is really awesome. But. If I make an error in my Python, the whole loop crashes and I need to go to my terminal to restart the app.

The ideal workflow from my perspective would be for the app to try to reload, and if there's a Python error, it would tell me on the console and then not exit but rather keep watching the file and if I re-save, it would load the file again, such that I could just look at my console, fix the error and resave, without having to leave my editor.

@T4rk1n @rmarren1 any thoughts on the feasibility of this?

chriddyp commented 5 years ago

it would tell me on the console

Or, when we are displaying these errors in the front-end, show the error message in the browser. Then, you'll never need to look at your terminal after you start your app!

T4rk1n commented 5 years ago

We always run our flask apps with app.run which according to the flask docs is not good for development with reloading and results in app crashing on syntax errors. http://flask.pocoo.org/docs/0.12/server/#in-code

nicolaskruchten commented 5 years ago

Is there some alternative we could use like app.run_debug() or something?

nicolaskruchten commented 5 years ago

In essence, what I want is what I get when I run while true; do python app.py; sleep 1; done :)

rmarren1 commented 5 years ago

This bit of code from the flask-failsafe module looks similar to what we want: https://github.com/mgood/flask-failsafe/blob/master/flask_failsafe.py

Wraps an app factory to provide a fallback in case of import errors. Takes a factory function to generate a Flask app. If there is an error creating the app, it will return a dummy app that just returns the Flask error page for the exception. This works with the Flask code reloader so that if the app fails during initialization it will still monitor those files for changes and reload the app.

Ideally, instead of the 'dummy app' we can just present the syntax error on the front end using https://github.com/plotly/dash-renderer/pull/100 (Dev Tools)

eric-burel commented 4 years ago

Hi, I've tested flask_failsafe and it works fine. I created a server.py which imports my app.py. Only limitation is that it seems expects the app to have a run function, instead of run_server. So I had to write app.run = app.run_server.

Why this naming differs from Flask naming? (I a am a beginner in both Flask and Dash)

Edit: create_app().server.run(port="8050", debug=True) could be the preferred syntax, as app.server is the underlying Flask server

alexcjohnson commented 4 years ago

Thanks for looking into this @eric-burel - it's not something we've gotten to yet but would certainly improve the experience. Ideally I'd like us to find a solution that doesn't require users to do anything special with their app code though.

eric-burel commented 4 years ago

They seem to say it's not doable in Flask related issue, hence the mandatory use of flask run command for a fully working reload: https://github.com/pallets/flask/issues/2424

I am not knowledgeable enough in Python to have any idea of a version without user intervention based on failsafe. The tough part seems to be their call to from app import app inside the create_app function.

Here is the final version of my server.py after a few try and learn:

from flask_failsafe import failsafe

@failsafe
def create_app():
    # note that the import is *inside* this function so that we can catch
    # errors that happen at import time
    from app import app
    return app.server

if __name__ == "__main__":
    # app.server is the underlying flask app
    create_app().run(port="8050", debug=True

and the run command becomes python server.py instead of python app.py

nikshingadiya commented 3 years ago

thank you all of you

rohitsathish commented 1 year ago

Seems like this issue is stale. Is there a better way to do this?

I came to dash after using streamlit. The latter simply shows the error in the browser which I feel is the most intuitive solution.