Getting Started
Typical usage:
% mkdir my_apps
% cd my_apps
First create one or more flask apps, each in their own module/folder:
% tree .
.
├── backend
│ └── __init__.py
├── frontend
│ └── __init__.py
└── hosted-flasks.yaml
Each containing for example a minimal Hello World Flask application:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello My Backend"
Next, we create a YAML configuration file, hosted-flasks.yaml, containing the flask apps we want to be served and how we want them to be served:
backend:
imports:
backend: backend/__init__.py
path: /backend
hostname: backend.localhost:8000
frontend:
imports:
frontend: frontend/__init__.py
path: /frontend
hostname: frontend.localhost:8000
In this case we want both apps served from a path on the default application (/backend and /frontend), as well as on a custom hostname (backend.localhost:8000 and frontend.localhost:8000).
Optionally, but highly recommended 😇, set up a virtual environment:
% pyenv virtualenv my_apps
% pyenv local my_apps
Install hosted-flasks and gunicorn (or your other favorite WSGI server) and start the Hosted Flasks server app:
% pip install hosted-flasks gunicorn eventlet
% gunicorn -k eventlet -w 1 hosted_flasks.server:app
[2024-04-28 15:35:46 +0200] [5320] [INFO] Starting gunicorn 22.0.0
[2024-04-28 15:35:46 +0200] [5320] [INFO] Listening at: http://127.0.0.1:8000 (5320)
[2024-04-28 15:35:46 +0200] [5320] [INFO] Using worker: eventlet
[2024-04-28 15:35:46 +0200] [5347] [INFO] Booting worker with pid: 5347
[2024-04-28 15:35:46 +0200] [5347] [INFO] [hosted_flasks.loader] 🌍 added backend
[2024-04-28 15:35:46 +0200] [5347] [INFO] [hosted_flasks.loader] 🌍 added frontend
[2024-04-28 15:35:46 +0200] [5347] [INFO] [hosted_flasks.server] ✅ 2 hosted flasks up & running...
You can now visit your backend Flask app from e.g.
And when visiting the root http://localhost:8000 you are presented with a frontpage listing the Hosted Flasks with links to their hosted locations:
