#!/usr/bin/env python3 # You can test it with: # curl --request POST --data string=foobar\&what=language http://localhost:4000 import wsgiref.simple_server as server import urllib.parse # PostgreSQL interface import psycopg2 # HTML templates http://www.yattag.org/ from yattag import Doc PORT = 4000 def pack(start_response, status, data): datae = data.encode() # Always encode to UTF-8 response_headers = [("Content-type", "text/plain; charset=UTF-8"), ("Content-Length", str(len(datae)))] start_response(status, response_headers) return [datae] def application(environ, start_response): if environ["REQUEST_METHOD"] != "POST": status = "405 Method unavailable" output = "Unsupported HTTP method \"%s\"\r\n" % environ["REQUEST_METHOD"] return pack(start_response, status, output) try: body_size = int(environ.get("CONTENT_LENGTH", 0)) except (ValueError): body_size = 0 body = environ["wsgi.input"].read(body_size) query = urllib.parse.parse_qsl(body.decode()) form = {} for q in query: form[q[0]] = q[1] for mandatory in ["string", "what"]: if mandatory not in form: status = "400 Invalid request" output = "Missing \"%s\" in request\r\n" % mandatory return pack(start_response, status, output) if form["what"] == "language": sql = "SELECT * FROM Languages WHERE code = %s" term = form["string"].lower() elif form["what"] == "script": sql = "SELECT * FROM Scripts WHERE code = %s" term = form["string"].capitalize() else: status = "400 Invalid request" output = "Unknown search category \"%s\"\r\n" % form["what"] return pack(start_response, status, output) cursor.execute(sql, (term, )) mytuple = cursor.fetchone() status = "200 OK" if mytuple is not None: output = "TODO %s\r\n" % str(mytuple) # TODO display comments, preferredscript, addition date etc Or a redirect to mulhtml's result? else: if form["what"] == "language": sql = "SELECT * FROM Languages,Descriptions_Languages,Descriptions WHERE Descriptions_Languages.description = Descriptions.id AND Descriptions_Languages.lang = Languages.code AND position(%s in lower(Descriptions.description)) > 0;" elif form["what"] == "script": raise "TODO not implemented" cursor.execute(sql, (term, )) found = False output = "" for tuple in cursor.fetchall(): output += "TODO %s\r\n" % str(tuple) found = True if not found: output = "\"%s\" not found\r\n" % term # TODO HTML with a templating engine? Yattag, probably # TODO link to mulhtml results? return pack(start_response, status, output) if __name__ == "__main__": conn = psycopg2.connect("dbname=lsr") cursor = conn.cursor() httpd = server.make_server("", PORT, application) print("Listening on port %s" % PORT) httpd.serve_forever()