Skip to content Skip to sidebar Skip to footer

Run Code Alongside A Flask Application

I've written a web interface for my python application. This functions beautifully when running export FLASK_APP=main.py followed by flask run. Now I want the actual application to

Solution 1:

It's possible, and sometime convenient, to run Flask in a thread off of a foreground application. There is a trick, a big pitfall, and a constraint.

The constraint is that this is something you'll want to do in a "safe" environment (e.g. on your laptop to server a local browser, or on your home intranet), as it involves running the development server, which is something you don't want to be doing in a hostile environment. You also can't use automatic page reloading (but you can enable debug).

The pitfall is that if the UI is sharing any non-trivial state (including dicts) with the foreground app, you'll need to use a shared threading.Lock() to guard access such that only one thread at a time is reading or writing data.

The trick is to inject a reference to shared state into the app's config after you create it but before you start it, doing something like:

defwebserver(state):
    app.config['STATE'] = state
    # If running on, say, a Raspberry Pi, use 0.0.0.0 so that# you can connect to the web server from your intranet.
    app.run(host='0.0.0.0', use_reloader=False, debug=True)

defmain():
    state = SharedState()
    web_thread = threading.Thread(target=webserver, args=(state,))
    web_thread.start()

    state.set('counter'0)
    whileTrue:
        # Do whatever you want in the foreground thread
        state.set('counter', state.get('counter') + 1)

classSharedState():
    def__init__(self):
        self.lock = threading.Lock()
        self.state = dict()

    defget(self, key):
        with self.lock:
            return self.state.get(key)

    defset(self, key, value):
        with self.lock:
            self.state[key] = value

Then, from within Flask view functions, do something like

@app.route('/')
def home():
    state = app.config['STATE']
    counter = state.get(counter)
    return render_template("index.html", counter=counter)

Post a Comment for "Run Code Alongside A Flask Application"