Reputation: 33
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:
Must be able to launch the browser from within Python.
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
Reputation: 46503
I slightly modified the main answer to:
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
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
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
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
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