#!/home/tjlahton/public_html/cgi-bin/ties4080/venv/bin/python # -*- coding: utf-8 -*- from flask import Flask, session, redirect, url_for, escape, request, Response, render_template, make_response import sqlite3 import os import sys import json app = Flask(__name__) app.debug = True def tietokanta(): #tietokantayhteyden avaaminen ja olennaiset asetukset try: con = sqlite3.connect(os.path.abspath('../../../piilo/oppilaitos')) con.row_factory = sqlite3.Row con.execute("PRAGMA foreign_keys = ON") except: #virheenkäsittely... return None return con @app.route('/postitoimipaikat', methods=['GET']) def postitoimipaikat(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT postinro, postitoimipaikka FROM Postitoimipaikka """) data = cur.fetchall() # muunnetaan kyselyn tulos json-muotoon. Tarvitaan oma konversiofunktio row_to_json json_data = json.dumps(data, default=row_to_json) resp = make_response(json_data, 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp @app.route('/postitoimipaikka', methods=['GET']) def postitoimipaikka(): con = tietokanta() postinro = request.args.get("postinro") if not postinro: resp = make_response(json.dumps([]), 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp cur = con.cursor() cur.execute(""" SELECT postinro, postitoimipaikka FROM Postitoimipaikka WHERE postinro = :postinro """,{"postinro": postinro}) data = cur.fetchall() # muunnetaan kyselyn tulos json-muotoon. Tarvitaan oma konversiofunktio row_to_json json_data = json.dumps(data, default=row_to_json) resp = make_response(json_data, 200) resp.charset = "UTF-8" resp.mimetype = "application/json" return resp # muuntaa sqlite3 row -tyyppisen objektin tavalliseksi dictiksi def row_to_json(row): d = dict() for key in row.keys(): d[key] = row[key] return d @app.route('/', methods=['GET']) def root(): return "kokeile http://users.jyu.fi/~tjlahton/cgi-bin/ties4080/ohjaus5/flask2.cgi/postitoimipaikat" @app.route('/hae_ryhmat', methods=['GET']) def hae_ryhmat(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT RyhmaID, RyhmaNimi FROM Oppilaitosryhma ORDER BY RyhmaID """) ryhmat = cur.fetchall() resp = make_response( render_template("ryhmat.xml",ryhmat=ryhmat, name="oppilaitosryhma")) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp from xml.dom.minidom import getDOMImplementation, parse, parseString @app.route('/hae_ryhmat2', methods=['GET']) def hae_ryhmat2(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT RyhmaID, RyhmaNimi FROM Oppilaitosryhma ORDER BY RyhmaID """) impl = getDOMImplementation() # createDocument(nimiavaruus, juurielementti, dokumenttityyppi) doc = impl.createDocument("http://www.w3.org/1999/xhtml", "select", None) # pakko laittaa seuraava, koska jostakin syystä edellinen ei riitä doc.documentElement.setAttribute("xmlns", "http://www.w3.org/1999/xhtml") doc.documentElement.setAttribute("name", "ryhmat") doc.documentElement.setAttribute("id", "ryhmat") for ryhma in cur.fetchall(): option = doc.createElement("option"); txt = doc.createTextNode( ryhma['ryhmanimi'] ); option.appendChild(txt) # minidom ei tue textContent-ominaisuutta # li.textContent = ryhma['ryhmanimi'] option.setAttribute("value", str(ryhma["ryhmaid"])) doc.documentElement.appendChild(option) resp = make_response( doc.toxml('UTF-8') ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp import xml.etree.ElementTree as ET @app.route('/hae_ryhmat3', methods=['GET']) def hae_ryhmat3(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT RyhmaID, RyhmaNimi FROM Oppilaitosryhma ORDER BY RyhmaID """) xml = """""" root = ET.fromstring( xml ) root.attrib["xmlns"] = "http://www.w3.org/1999/xhtml" for ryhma in cur.fetchall(): option = ET.SubElement(root, "option") option.text = ryhma['ryhmanimi'] option.attrib['value'] = str(ryhma["ryhmaid"]) resp = make_response( ET.tostring( root, encoding="UTF-8", method="xml" ) ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp #vanha versio, joka palauttaa tiedot xhtml-muodossa #toteutettu elementreellä @app.route('/oppilaitokset_old', methods=['GET']) def oppilaitokset_old(): con = tietokanta() cur = con.cursor() ryhmaid = request.args.get("ryhmaid", None) if ryhmaid: cur.execute(""" SELECT OppilaitosID, Nimi FROM Oppilaitos WHERE Oppilaitosryhma = :ryhmaid """, {"ryhmaid": ryhmaid }) else: cur.execute(""" SELECT OppilaitosID, Nimi FROM Oppilaitos """) #elementtree-versio xml = """""" root = ET.fromstring( xml ) root.attrib["xmlns"] = "http://www.w3.org/1999/xhtml" for ryhma in cur.fetchall(): option = ET.SubElement(root, "option") option.text = ryhma['nimi'] option.attrib['value'] = str(ryhma["oppilaitosid"]) resp = make_response( ET.tostring( root, encoding="UTF-8", method="xml" ) ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp #uusi versio, joka käyttää itse keksittyä xml-rakennetta #toteutettu minidomilla @app.route('/oppilaitokset', methods=['GET']) def oppilaitokset(): con = tietokanta() cur = con.cursor() ryhmaid = request.args.get("ryhmaid", None) if ryhmaid: cur.execute(""" SELECT OppilaitosID, Nimi FROM Oppilaitos WHERE Oppilaitosryhma = :ryhmaid """, {"ryhmaid": ryhmaid }) else: cur.execute(""" SELECT OppilaitosID, Nimi FROM Oppilaitos """) #minidom-versio impl = getDOMImplementation() doc = impl.createDocument(None, "oppilaitokset", None) root = doc.documentElement for ryhma in cur.fetchall(): oppilaitos = doc.createElement("oppilaitos") text = doc.createTextNode( ryhma['nimi'] ) oppilaitos.appendChild( text ) oppilaitos.setAttribute("id", str(ryhma["oppilaitosid"]) ) root.appendChild( oppilaitos ) resp = make_response( doc.toxml( encoding="UTF-8" ) ) resp.charset = "UTF-8" resp.mimetype = "text/xml" return resp @app.route('/tilaajat', methods=['GET']) def tilaajat(): con = tietokanta() cur = con.cursor() cur.execute(""" SELECT etunimi, sukunimi, lahiosoite, postinumero, postitoimipaikka, nimi FROM tilaaja, postitoimipaikka, oppilaitos WHERE tilaaja.postinumero = postitoimipaikka.postinro AND tilaaja.oppilaitos = oppilaitos.oppilaitosID """) xml = """