kc64
kc64

Reputation: 33

Using Flask web app as Windows application

We have a web application developed using Flask that runs on a Windows server with clients that connect to it. We now have a use case where it is desired that the server and client be combined onto a laptop so that both server and client code run together and make it appear as a native Windows application.

Basically, we now have two requirements that we did not have before:

  1. Must be able to launch the browser from within Python.

  2. Must be able to terminate the Python (Flask) application on browser window close.

We have succeeded in item 1. Item 2 remains elusive. We have tried terminating the werkzeug server but the Python code keeps running. Seeking help from those that know.

Upvotes: 2

Views: 6728

Answers (5)

Basj
Basj

Reputation: 46503

I slightly modified the main answer to:

  • make it work with current Chrome version
  • make it usable out-of-the-box (include a minimal Flask server).

This works and exits the server when Chrome is closed:

from multiprocessing import Process, freeze_support
from flask import Flask

def run_browser():
    import webbrowser
    chrome = webbrowser.get(r'"C:\Program Files\Google\Chrome\Application\chrome.exe" %s')
    chrome.open('http://localhost:5000/')

def run_app():
    app = Flask("test")
    @app.route("/")
    def index():
        return "Hello world"
    app.run()

if __name__ == '__main__':
    freeze_support()  # Add support for when a program which uses multiprocessing has been frozen to produce a Windows executable. (Has been tested with py2exe, PyInstaller and cx_Freeze.) One needs to call this function straight after the if __name__ == '__main__' line of the main module.

    a = Process(target=run_app)
    a.daemon = True
    a.start()

    b = Process(target=run_browser)
    b.start()
    b.join()

Upvotes: 0

Ajeeth B
Ajeeth B

Reputation: 3

Here is an example for flaskwebgui.

I have used pyinstaller to convert the python-flask application to executable file.

I used Installforge to convert the build files to setup(installer) file.

Upvotes: 0

Teodoros
Teodoros

Reputation: 489

This is an easier way with flaskwebgui

from flaskwebgui import FlaskUI

app = Flask(__name__)
ui = FlaskUI(app)

ui.run()

flaskwebgui - Create desktop applications with Flask (or Django)!

https://pypi.org/project/flaskwebgui/

Upvotes: 0

kc64
kc64

Reputation: 33

After reading the docs more thoroughly and experimenting with the implementation, we found the following main code to satisfy the objective.

from multiprocessing import Process, freeze_support


def run_browser():
    import webbrowser
    chrome = webbrowser.get(r'C:\\Program\ Files\ (x86)\\Google\\Chrome\\Application\\chrome.exe --window-size=500,500 --app=%s')
    chrome.open('http://localhost:5000/gui')

def run_app():
    from app import webapp
    webapp.run() #debug=True) #, use_reloader=False)

if __name__ == '__main__':
    freeze_support()

    a = Process(target=run_app)
    a.daemon = True
    a.start()

    b = Process(target=run_browser)
    b.start()
    b.join()

Upvotes: 1

Pitto
Pitto

Reputation: 8579

I do not currently have a Windows client here so I cannot exactly test what I am suggesting.

Using pywinauto you can check for a Window's name.

You could build a script that checks this in background and kills your Flask application when the requested browser window is not opened.

from pywinauto.findwindows import find_windows
if not find_windows(best_match='YOURWINDOWNAMEHERE'):
    # Do your kill

Upvotes: 0

Related Questions