"""Web Server Gateway Interface with autoreload to render spawner template. Usage: `python -m render` """ from traceback import format_exc from flask import Flask, render_template, request from glicid_spawner.form import TEMPLATE_FORM, options_from_form from glicid_spawner.micromamba import MicromambaEnv from glicid_spawner.resources import CPU, GPU, RAM from livereload import Server # Monkeypatch OPTIONS = { 'username': 'john-doe', 'python_envs': [ MicromambaEnv('USER', 'foo', '/john-doe/envs/foo'), MicromambaEnv('USER', 'bar', '/john-doe/envs/bar'), MicromambaEnv('GLOBAL', 'baz', '/global/envs/baz'), ], 'cpu_available': CPU, 'ram_available': RAM, 'gpu_available': GPU, } # Flask app app = Flask(__name__) app.debug = True @app.route('/') def home(): """Form spawner home page.""" return render_template( 'form.html', spawner_options_form=TEMPLATE_FORM.render(**OPTIONS), options=OPTIONS ) @app.route('/submit', methods=['POST']) def submit(): """Reformat form data and extract spawner options. https://jupyterhub.readthedocs.io/en/stable/reference/spawners.html#spawner-options-from-form """ formdata = dict(request.form.lists()) # Trying to parse the options from the formdata try: return render_template( 'options.html', formdata=formdata, options=options_from_form(formdata) ) except Exception: return render_template('options.html', formdata=formdata, err=format_exc()) def server_autoreload(): """Start auto-reload server.""" server = Server(app.wsgi_app) server.serve() if __name__ == '__main__': server_autoreload()