Flask ja tietokantasovellus

Tässä harjoituksessa toteutan palvelinpuolen ohjelman Python Flaskilla, tietokantana on PostgreSQL. Harjoitus on jatko mod_wsgi , PostgreSQL ja Flask-asennuksille. Mallia otettu täältä.

Asennetaan tarvittavat paketit

$ sudo apt-get -y install python3-flask-sqlalchemy python3-psycopg2

Pääohjelma testaamista vartan

# kanta.py
# modified from http://terokarvinen.com/2017/database-connection-from-python-flask-to-postgre-using-raw-sql
# done 3.10.2018

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///juhawsgi'
app.config['SECRET_KEY'] = 'dfgdfgdfDFGDFGrteERTewasFRdasFGRd'

def sql(rawSql, sqlVars={}):
assert type(rawSql)==str
assert type(sqlVars)==dict
res=db.session.execute(rawSql, sqlVars)
db.session.commit()
return res

@app.before_first_request
def initDBforFlask():
sql("CREATE TABLE IF NOT EXISTS horses (id SERIAL PRIMARY KEY, name VARCHAR(160) UNIQUE);")
sql("INSERT INTO horses(name) VALUES ('Tanhupallo') ON CONFLICT (name) DO NOTHING;")
sql("INSERT INTO horses(name) VALUES ('Kira') ON CONFLICT (name) DO NOTHING;")
sql("INSERT INTO horses(name) VALUES ('Juha') ON CONFLICT (name) DO NOTHING;")
sql("INSERT INTO horses(name) VALUES ('Luumu') ON CONFLICT (name) DO NOTHING;"
)

@app.route("/")
def hello():
return "See you at JuhaImmonen.com! <a href='/horses'>List horses</a>\n"

@app.route("/horses")
def horses():
horses=sql("SELECT * FROM horses;")
return render_template("horses.html", horses=horses)

if __name__ == "__main__":
from flask_sqlalchemy import get_debug_queries
app.run(debug=True)

Templates

templates/horses.html

{% extends "base.html" %}

{%block title%} Horses {%endblock title%}

{% block contents %}
<h1>Horses</h1>
{% for horse in horses %}
<p>{{ horse.name }}</p>
{% endfor %}
{% endblock contents %}

templates/base.html

<!doctype html>
<html>
<head>
<title>
{%block title%}
Hello World
{%endblock title%}
</title>
<meta charset="utf-8" />
</head>
<body>
{% block contents %}
<h1>Hello World</h1>
<p>Let's test UTF-8 with "päivää"</p>
{% endblock contents %}
</body>
</html>

Testaus

Ajettu ohjelma menemällä URL: http://juhawsgi.juhaimmonen.com/

Ohjelma ei toimi, tulostuu “Internal Server Error”

Apachen error.log:ssa on paljon lokitusta. En tiedä tässä vaiheessa mikä on todellinen syy. Onko se tämä:

3
6] sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) FATAL: role “juhawsgi” does not exist

Pitää luoda tietokanta ja käyttäjä, helpointa on käyttää teknistä käyttäjää juhawsgi, jolloin login PostgreSQL kantaan toimii automaattisesti.

Luodaan tietokanta ja käyttäjä

$ sudo -u postgres createdb juhawsgi
$ sudo -u postgres createuser juhawsgi

Ajettu uudelleen ohjelma menemällä URL: http://juhawsgi.juhaimmonen.com/

Nyt toimii ja tietokannasta saadaan myös dataa

Leave a Reply

Your email address will not be published. Required fields are marked *