kangas-demo / app.py
CalebCometML's picture
Update app.py
19b6ea5
raw
history blame
5.75 kB
import requests
from flask import Flask, Response, request
import socket
from pathlib import Path
import streamlit
from streamlit import config as _config
from streamlit import web
import kangas as kg
import subprocess
proj_dir = Path(__file__).parent
filename = proj_dir / "streamlitapp.py"
_config.set_option("server.headless", True)
_config.set_option("server.port", 7840)
args = []
hostname = socket.gethostname()
ip_address = socket.gethostbyname(hostname)
application = Flask(__name__, static_url_path='')
def _is_running(kangas=False, streamlit=False):
output = subprocess.check_output(['ps', '-A']).decode('utf-8')
application.logger.info(f"{output}")
running = False
if kangas is True:
if "kangas" in output:
running = True
application.logger.info(f"kangas is running")
if streamlit is True:
if "streamlit" in output:
running = True
application.logger.info(f"streamlit is running")
else:
running = False
return running
@application.route('/kangas', strict_slashes=False)
@application.route('/kangas/<path:path>')
def kangas_proxy(path=None):
query_string = request.query_string.decode('utf-8')
if path is None and len(query_string) < 1:
resp = requests.get(f'http://{ip_address}:7640/')
else:
if path is None:
path = ''
resp = requests.get(f'http://{ip_address}:7640/{str(path)}?{query_string}')
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
return response
@application.route('/api/<path:path>')
def api_proxy(path):
query_string = request.query_string.decode('utf-8')
resp = requests.get(f'http://{ip_address}:7640/api/{path}?{query_string}')
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
return response
@application.route('/_next/<path:path>')
def next_proxy(path=None):
application.logger.info("PATH: %s" % path)
resp = requests.get(f'http://{ip_address}:7640/_next/%s' % path)
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
return response
@application.route('/<path>.png')
@application.route('/<path>.ico')
def image_proxy(path=None):
application.logger.info(path)
resp = requests.get(f'http://{ip_address}:7640/%s.png' % path)
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
application.logger.info(response)
return response
@application.route('/')
def streamlit():
resp = requests.get(f'http://{ip_address}:7840/')
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
application.logger.info(response)
return response
@application.route('/static/<path:path>')
def streamlit_static(path):
resp = requests.get(f'http://{ip_address}:7840/static/{path}')
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
application.logger.info(response)
return response
@application.route('/vendor/<path:path>')
def streamlit_vendor(path):
resp = requests.get(f'http://{ip_address}:7840/vendor/{path}')
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
application.logger.info(response)
return response
@application.route('/_stcore/<path:path>')
def streamlit_stcore(path):
resp = requests.get(f'http://{ip_address}:7840/_stcore/{path}')
excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
headers = [(name, value) for (name, value) in resp.raw.headers.items() if name.lower() not in excluded_headers]
response = Response(resp.content, resp.status_code, headers)
application.logger.info(response)
return response
if __name__ == "__main__":
streamlit_runs = _is_running(False, True)
if streamlit_runs is False:
application.logger.info("Streamlit is not running yet")
subprocess.Popen(["streamlit", "run", "streamlitapp.py", "--server.port", "7840"])
if kg._is_running("node", "kangas"):
application.logger.info("Kangas is running on startup")
else:
application.logger.info("Kangas is not running on startup")
subprocess.Popen(["kangas", "server", "--frontend-port", "7640", "--frontend-root", "kangas"])
application.run(host="0.0.0.0", port="7860")