from flask import Flask from flask import render_template from flask import request from diagrams import Generators,Generator,Example import os from flask.helpers import send_from_directory import argparse import sys scriptdir=os.path.dirname(os.path.abspath(__file__)) app = Flask(__name__,static_url_path='',static_folder=scriptdir+'/../web', template_folder=scriptdir+'/../templates') @app.route('/') def home(): return index() def index(err=None,gen='dot',source="",message="",genResult=None): """ render index page with the given parameters""" return render_template('index.html',gen=gen,gens=Generators.generators(),err=err, message=message, source=source,genResult=genResult) @app.route('/example/') def example(generator): """ get the given example generator """ txt=Example.get(generator) return txt @app.route('/check/') def check(generator): gen=Generators.get(generator) if gen is not None: return gen.getHtmlInfo() else: return "%s is not a valid generator" % generator @app.route('/render//', methods=['GET']) def render(outputType,crc32): # allow extension ending for direct rendering e.g. in wikis ext="."+outputType if crc32.endswith(ext): crc32=crc32[:-len(ext)] outputDirectory=Generator.getOutputDirectory() filename="%s.%s" % (crc32,outputType) #print ("outputDirectory %s\nfilename %s" % (outputDirectory, filename), file=sys.stderr) return send_from_directory(outputDirectory, filename) @app.route('/render', methods=['POST']) def renderForWikiExtension(): """ endpoint for diagrams extension""" source=request.form.get('source') renderer=request.form.get('renderer') types=request.form.get('types') ip=request.remote_addr generator=request.form.get('generator') gen=Generators.get(generator) #print ("generator %s\nsource %s\nrenderer %s\ntypes %s" % (generator, source, renderer, types), file=sys.stderr) result=gen.generate(generator,source,'png',renderer) json=result.asJson(request.base_url) return json @app.route('/diagrams', methods=['GET', 'POST']) #allow both GET and POST requests def form_example(): err=None genResult=None message="" source=None gen=None if request.method == 'POST': try: source = request.form.get('source') alias=request.form.get('generator') generatorId=Generators.generatorIdForAlias(alias) outputType=request.form.get(generatorId+'-output') gen=Generators.get(generatorId) if gen is None: raise Exception("invalid generator %s",generatorId) genResult=gen.generate(alias,source,outputType,useCached=True) if not genResult.isValid(): raise Exception("could not generate %s for %s",outputType,generatorId) except Exception as ex: err=ex return index(err=err, message=message,source=source,gen=gen,genResult=genResult) if __name__ == '__main__': parser = argparse.ArgumentParser(description="Diagrams rendering webservice") parser.add_argument('--debug', action='store_true', help="run in debug mode") parser.add_argument('--port', type=int, default=5003, help="the port to use") parser.add_argument('--host', default="0.0.0.0", help="the host to serve for") args=parser.parse_args(sys.argv[1:]) app.run(debug=args.debug,port=args.port,host=args.host)