diff options
author | Kristian Lyngstol <kristian@bohemians.org> | 2016-11-14 14:13:46 +0100 |
---|---|---|
committer | Kristian Lyngstol <kristian@bohemians.org> | 2016-11-14 14:13:46 +0100 |
commit | 752f4846f42ed0758c013820def30bca92f8a5d0 (patch) | |
tree | 8a9562c561c16465079ccea7134d643901ea34f8 /templating/templating.py | |
parent | 2c27e86a0f0291a40d45b3da9e9773983d49c2ad (diff) |
Templating with POST support
Probably has to be tweaked a bit, but it works.
Fixes #146
Diffstat (limited to 'templating/templating.py')
-rwxr-xr-x | templating/templating.py | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/templating/templating.py b/templating/templating.py index 832beab..d4cb7f8 100755 --- a/templating/templating.py +++ b/templating/templating.py @@ -1,14 +1,15 @@ -#!/usr/bin/env python3.4 +#!/usr/bin/env python3 import requests,traceback from jinja2 import Template,Environment,FileSystemLoader import json +import http.server endpoints = "read/oplog read/snmp read/switches-management public/config public/dhcp public/dhcp-summary public/ping public/switches public/switch-state".split() objects = dict() def getEndpoint(endpoint): - r = requests.get("http://gondul-front:/api/%s" % endpoint) + r = requests.get("http://gondul-front/api/%s" % endpoint) if (r.status_code != 200): raise Exception("Bad status code for endpoint %s: %s" % (endpoint, r.status_code)) return r.json() @@ -19,36 +20,59 @@ def updateData(): env = Environment(loader=FileSystemLoader(['templates/','/opt/gondul/web/templates']),lstrip_blocks=True, trim_blocks=True) -import http.server class MyHandler(http.server.BaseHTTPRequestHandler): - def do_GET(self): - print (self.path[1:]) - updateData() + + body = "" + options = dict() + + def parse_options(self): url = self.path[1:] - options = dict() + self.url = url if url.find("?") != -1: - (url, tmpoptions) = url.split("?") - print (tmpoptions) + (self.url, tmpoptions) = url.split("?") tmptuples = tmpoptions.split("&") - print (tmptuples) for a in tmptuples: (x,y) = a.split("=") - options[x] = y - + self.options[x] = y + + def finalize_reply(self): + self.send_header('Content-Length', int(len(self.body))) + self.end_headers() + self.wfile.write(self.body) + self.wfile.flush() + + def do_GET(self): + updateData() + self.parse_options() try: - template = env.get_template(url) - body = template.render(objects=objects, options=options).encode('UTF-8') + template = env.get_template(self.url) + self.body = template.render(objects=objects, options=self.options).encode('UTF-8') self.send_response(200) self.send_header('Cache-Control','max-age=30, s-maxage=5') except Exception as err: - body = ("Templating of %s failed to render. Most likely due to an error in the template. Error transcript:\n\n%s\n----\n\n%s\n" % (url, err, traceback.format_exc())).encode('UTF-8') + self.body = ("Templating of %s failed to render. Most likely due to an error in the template. Error transcript:\n\n%s\n----\n\n%s\n" % (self.url, err, traceback.format_exc())).encode('UTF-8') self.send_response(500) self.send_header('Cache-Control','max-age=1, s-maxage=1') - self.send_header('Content-Length', int(len(body))) - self.end_headers() - self.wfile.write(body) - self.wfile.flush() - + self.finalize_reply() + + def do_POST(self): + updateData() + self.parse_options() + try: + length = self.headers.get('content-length') + if not length: + length = 0 + content = self.rfile.read(int(length)).decode('UTF-8') + template = Template(content) + self.body = template.render(options=self.options).encode('UTF-8') + self.send_response(200) + self.send_header('Cache-Control','max-age=30, s-maxage=5') + except Exception as err: + self.body = ("Templating of %s failed to render. Most likely due to an error in the template. Error transcript:\n\n%s\n----\n\n%s\n" % (self.url, err, traceback.format_exc())).encode('UTF-8') + self.send_response(500) + self.send_header('Cache-Control','max-age=1, s-maxage=1') + self.finalize_reply() + def run(server_class=http.server.HTTPServer, handler_class=http.server.BaseHTTPRequestHandler): server_address = ('', 8080) httpd = server_class(server_address, handler_class) |