"""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 TEMPLATES, options_from_form from glicid_spawner.micromamba import MicromambaEnv from glicid_spawner.resources import CPU, GPU, RAM from livereload import Server # Dummy username and python environments USERNAME = 'john-doe' ENVS = [ MicromambaEnv('USER', 'foo', f'/{USERNAME}/envs/foo'), MicromambaEnv('USER', 'bar', f'/{USERNAME}/envs/bar'), MicromambaEnv('GLOBAL', 'baz', '/global/envs/baz'), ] OPTIONS = { 'username': USERNAME, 'envs': ENVS, 'cpus': CPU, 'rams': RAM, 'gpus': 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=TEMPLATES.get_template('spawner_form.jinja').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()