#!/usr/bin/python # -*- coding: utf-8 -*- from flask import Flask, session, redirect, url_for, escape, request, Response, render_template import hashlib import sys from functools import wraps import sqlite3 import logging import os # debuggausta helpottaa seuraava, joka tekee samaan kansioon flask.log-tiedoston logging.basicConfig(filename='flask.log',level=logging.DEBUG) from contextlib import closing app = Flask(__name__) app.debug = True # set the secret key. keep this really secret: app.secret_key = '"\xf9$T\x88\xefT8[\xf1\xc4Y-r@\t\xec!5d\xf9\xcc\xa2\xaa' def auth(f): ''' Tämä decorator hoitaa kirjautumisen tarkistamisen ja ohjaa tarvittaessa kirjautumissivulle ''' @wraps(f) def decorated(*args, **kwargs): if not 'kirjautunut' in session: return redirect(url_for('kirjaudu')) return f(*args, **kwargs) return decorated @app.route('/kirjaudu', methods=['POST','GET']) def kirjaudu(): try: tunnus = request.form['tunnus'] except: tunnus = "" try: salasana = request.form['salasana'] except: salasana = "" # tähän pitää rakentaa varsinainen salasanan tarkistaminen # koskaan ei pidä tallentaa tai vertailla selkokielisiä salasanoja! # salasanan digest-versio haettaisiin oikeasti esim. tietokannasta # Tässä salasana on nyt vakio m = hashlib.sha512() avain = "omasalainenavain" m.update(avain) m.update(salasana) if len(tunnus) and m.digest() == "6n\x90\xb5\xfe)\xa9\xd9\xc1B\n\xfa3LK\x19\xc4\xd6=\xcd \x0fBKz\x9f\xe32\x8a5-\xa5\x81\x8f\xc0<\xff\xa4c\xc26-\xb3S[a-\xf4\xeb'\xdf3\xd4r\x0f\xbfY)dW\x1a\xd7W.": session['kirjautunut'] = "ok" return redirect(url_for('laskuri')) return render_template('kirjaudu.html') @app.route('/logout') def logout(): session.pop('kirjautunut',None) return redirect(url_for('kirjaudu')) @app.route('/') def hello_world(): return Response("Hello World", content_type="text/plain; charset=UTF-8") @app.route('/laskuri', methods=['POST','GET']) @auth def laskuri(): try: luku = int(request.form['luku']) except: luku = 0 try: session['summa'] = session['summa'] + luku except: session['summa'] = 0 return render_template('laskuri.html', luku=luku) @app.route('/nollaa') def nollaa(): session.pop('summa',None) return redirect(url_for('laskuri')) @app.route('/lomake', methods=['POST','GET']) def lomake(): tiedekunnat = {0:"Valitse tiedekunta", 1:"Humanistinen tiedekunta",2:"Informaatioteknologin tiedekunta", 3:"Kasvatustieteiden tiedekunta", 4:"Liikunta- ja terveystieteiden tiedekunta", 5:"Matemaattis-luonnontieteellinen tiedekunta", 6:"Taloustieteiden tiedekunta", 7:"Yhteiskuntatieteellinen tiedekunta"} kentat = {"etunimi":"","sukunimi":"","tdk":""} errors = dict(kentat) #tekee kopion errors2 = {} kentat2 = {} tehtavia = 9 # lisätään tehtäviä varten errors-dictiin paikat if request.method == 'POST': #varmistetaan, että lomake on lähetetty for k in errors: try: kentat[k] = request.form[k] except KeyError: errors[k] = u"!" # ei kelpuuteta välilyöntejä ym. whitespace-merkkejä if not len(kentat[k].strip()): errors[k] = "!" # varmistetaan että tiedekunnan valinta on integer niin voi suoraan vertailla dictin avaimiin try: kentat["tdk"] = int(kentat["tdk"]) except KeyError: kentat["tdk"] = 0 for i in range(1, tehtavia): errors2["t"+str(i)] = "" kentat2["t"+str(i)] = "1" return render_template('lomake.html', errors=errors, kentat=kentat, tiedekunnat=tiedekunnat, errors2=errors2, tehtavia=tehtavia, kentat2=kentat2) # avataan tietokantayhtyes niin että se on käytettävissä kaikissa funktioissa # g-objektiin voi säilöä globaaleja tietoja yhden sivukutsun (request) ajaksi. Älä käytä tavallisia globaaleja muuttujia! # Jostain syystä g-objekti ei toimi. Johtuneeko Flaskin ajamisesta CGI-ympäristössä? #@app.before_request #def before_request(): # flask.g.db = connect_db() # siivotaan jäljet ja suljetaan tietokantayhteys #@app.teardown_request #def teardown_request(exception): # db = getattr(g, 'db', None) # if db is not None: # db.close() def connect_db(): try: # sqlite haluaa absoluuttisen polun con = sqlite3.connect(os.path.abspath('../hidden/resepti')) con.row_factory = sqlite3.Row # kirjoittaa rivin lokitiedostoon logging.debug("onnistui!") except Exception as e: logging.debug("Kanta ei aukea") logging.debug(str(e)) return con @app.route('/reseptit') def reseptit(): db = connect_db() #avataan tietokantayhteys try: cur = db.execute('select nimi, kuvaus, henkilomaara from resepti') reseptit = [dict(nimi=row[0], kuvaus=row[1], maara=row[2]) for row in cur.fetchall()] reseptit = [] cur = db.execute('select nimi, kuvaus, henkilomaara from resepti') for row in cur.fetchall(): reseptit.append( dict(nimi=row[0], kuvaus=row[1], maara=row[2]) ) cur = db.execute('select nimi AS Nimi, kuvaus AS Kuvaus, henkilomaara AS Henkilomaara from resepti') reseptit = [] for row in cur.fetchall(): reseptit.append( dict(nimi=row['Nimi'], kuvaus=row['Kuvaus'], maara=row['Henkilomaara']) ) except Exception as e: logging.debug(str(e)) reseptit = "" db.close() #muista sulkea tietokantayhteys return render_template('reseptit.html', reseptit=reseptit) if __name__ == '__main__': # debug-moodi ei turvallisuussyistä toimi users.jyu.fi:ssä :-( app.debug = True app.run(debug=True)