Streamlit restful app

Is there a way to create a restful app using only streamlit, like Flask?
Or can you provide such an example using Flask? This would be very helpful.
I am loving Streamlit so far.

Hi @Nelson_Silva

That’s an awesome idea. Streamlit doesn’t support that use case at the moment, and after looking at the internals of our code I don’t see a good way to hack it together either.

So I opened a feature request here: https://github.com/streamlit/streamlit/issues/439


I said I don’t see a good way to hack it, because a nasty hack would be to hijack one of Streamlit’s “script threads” to serve your Flask app. I have no idea how well that would perform, though. Use at your own risk!

import streamlit as st

if not hasattr(st, 'already_started_server'):
    # Hack the fact that Python modules (like st) only load once to
    # keep track of whether this file already ran.
    st.already_started_server = True

    st.write('''
        The first time this script executes it will run forever because it's
        running a Flask server.

        Just close this browser tab and open a new one to see your Streamlit
        app.
    ''')

    from flask import Flask

    app = Flask(__name__)

    @app.route('/foo')
    def serve_foo():
        return 'This page is served via Flask!'

    app.run(port=8888)


# We'll never reach this part of the code the first time this file executes!

# Your normal Streamlit app goes here:
x = st.slider('Pick a number')
st.write('You picked:', x)

If you run the code above, you can then go to localhost:8888/foo to see some data served via Flask.

3 Likes

I like this workaround, I should try this on my existing app, I like dual apps like this - is there any technical downside to this from REST point of view or websockets or serving point of view?

1 Like

Thanks @thiago I will try this :slight_smile:

@neomatrix369 besides some code style complexity, I think the main downside is just performance. Both servers are running on the same Python process, which means they share the same Global Interpreter Lock.

@Nelson_Silva Please let us know if that worked or not for you :slight_smile:

As streamlit is running on Tornado my guess there would be some Tornado way of offering rest api endpoints.

I would really like this functionality in order to be able to serve csv, excel, parquet etc. files for my users.

1 Like

This loads flask in 8888 and streamlit in 8501. can then run in same port with different endpoints ?

My guess is that’s not really possible. I don’t think Flask and Tornado (which Streamlit uses) were written with that kind of use case in mind.

That said, we’re actually designing some solutions for the use case @Marc mentioned above, where the developer wants to serve files. So stay tuned!

1 Like

I kinda achieved what i want with hosting in different ports but using F5 to show it as if they are in different endpoints of a single domain

I hope that it can be done.

If it’s possible, I think streamlit is really l33t. I’m enjoying deploying my models in AWS without the hassle of flask and I can edit the codes at VSCODE and view the output once I ctrl-S :slight_smile:

Thank you!

1 Like

I’d love to see that too! It’d be even better if your REST API could be auto generated like @thiago suggested, for instance from your widgets and variables.