Python Web Framework Flask

Kurssilla oli annettu tehtäväksi asentaa flask web-kehitys ympäristö web-sivuja varten. Tarkemmat ohjeet ovat:

Kirjoita oma “hei maailma” Flaskin testipalvelimella.
Tee tuotantotyyppinen asennus Python Flaskista (Apache mod_wsgi).
Lue tietueita Postgre-tietokannasta Flaskilla.

Aloitan tehtävän vuokraamalla digitaloceanilta virtuaalipalvelimen. Palvelimessa käyttöjärjestelmänä on Ubuntu 16.04.3 x64. Asennan palvelimen edellisen tehtävän mukaisesti. Linkki tehtävään.  kun olen luonut uuden käyttäjän ja olen testannut sitä, asennan tarvittavat ohjelmat.

sudo apt install -y python3 python3-pip apache2 libapache2-mod-wsgi-py3 python3-flask

Aloitan tekemällä kansion flask ja tekemällä sinne tiedoston test.py. Test.py tiedostoon tulee seuraava koodi:

from flask import Flask
app = Flask(__name__)

@app.route(’/’)
def hello_world():
return ’Hello World’

Nyt laitan virtualhostin jotta saisin sivun näkymään. Ensin pitää luoda Apacheen uusi virtualhost tiedosto setapahtuu komennolla:

sudoedit /etc/apache2/sites-available/test.conf

Tiedostoon tulee

## /etc/apache2/sites-available/test.conf

<VirtualHost *>
ServerName eemeli.example.com

WSGIDaemonProcess test user=eemeli group=eemeli threads=5
WSGIScriptAlias / /home/eemeli/flask/test.wsgi

<Directory /home/eemeli/flask/>
WSGIProcessGroup test
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On

Require all granted
</Directory>
</VirtualHost>

Seuraavaksi ajan seuraavat komennot jotta saisin sivun asetukset voimaan.

sudo a2dissite 000-default.conf

sudo a2ensite test.conf

sudo service apache2 restart

Nyt enää ei toimi apachen oletus sivu kun selaan palvelimen ip-osoitteeseen. Seuraavaksi pitää tehdä test.wsgi tiedosto flask kansioon joka käynnistää python koodin ja tarjoilee sivun käyttäjille. Tiedostoon pitää lisätä seuraavat:

import sys

if sys.version_info[0]<3: # require python3
raise Exception(”Python3 required! Current (wrong) version: ’%s'” % sys.version_info)

sys.path.insert(0, ’/home/eemeli/flask/’)
from test import app as application

Ja lopuksi pitää käynnistää Apache2 uudelleen. Nyt selaimessa näkyy seuraava kun menen ip-osoitteeseen

Screen Shot 2017-10-04 at 13.46.14.png

 

Seuraavaksi pitäisi saada tulostettua tietueita sql-tietokannasta. Tässä käytän Postgresql-tietokantaohjelmaa. Ensin asensin Postgre ohjelman komennolla:

sudo apt-get install postgresql

Seuraavaksi teen tietokannan.

sudo -u postgres createdb eemeli

Sitten teen käyttäjän tietokantaan.

sudo -u postgres createuser eemeli

Jotta saisin tulostettua tietokannasta tietoa tarvitsen seuraavat ohjelmat.

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

Nyt pitää muokata test.py tiedostoa

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

app.config[’SQLALCHEMY_DATABASE_URI’] = ’postgresql:///eemeli’
app.config[’SECRET_KEY’] = ’kdsnAosgg573DFmvO83n836Gn93H’

def sql(rawSql, sqlVars={}):
”Execute raw sql, optionally with prepared query”
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 animals (id SERIAL PRIMARY KEY, name VARCHAR(160) UNIQUE);”)
sql(”INSERT INTO animals(name) VALUES (’Lion’) ON CONFLICT (name) DO NOTHING;”)
sql(”INSERT INTO animals(name) VALUES (’Dragon’) ON CONFLICT (name) DO NOTHING;”)
sql(”INSERT INTO animals(name) VALUES (’Horse’) ON CONFLICT (name) DO NOTHING;”)

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

@app.route(’/’)
def hello_world():
return ”Hello World”

 

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

Nyt pitää tehdä kansio templates flask kansion alle johon tulee HTML sapluunat (templates). Ensin teen base.html joka on kaikkien tulevien sivujen pohja.

<!doctype html>

<html>

<head>

<title>{%block title%} Hello World {%endblock title%} </title>

<meta charset=”utf-8″ />

</head>

<body>

{% block contents %}

<h1>Hello World</h1>

{% endblock contents %}

</body>

</html>

Seuraavaksi pitää tehdä sivu johon tietokannan tiedot tulostetaan. Sen nimeksi tulee animals koska tietokannassa on eläimiä.

{% extends ”base.html” %}

{%block title%} Animals {%endblock title%}

{% block contents %}
<h1>Animals</h1>
{% for animal in animals %}
<p>{{ animal.name }}</p>
{% endfor %}
{% endblock contents %}

Huomaan että koodi toimii kun menen osoiteeseen PALVELIMEN-IP/animals.

Screen Shot 2017-10-04 at 14.09.43.png

 

Lähteet:

http://terokarvinen.com/2017/aikataulu-linux-palvelimet-ict4tn021-4-ti-ja-5-to-alkusyksy-2017-5-op

http://terokarvinen.com/2016/deploy-flask-python3-on-apache2-ubuntu

http://terokarvinen.com/2016/install-postgresql-on-ubuntu-new-user-and-database-in-3-commands

http://terokarvinen.com/2017/database-connection-from-python-flask-to-postgre-using-raw-sql

Mainokset

Yksi vastaus artikkeliiin “Python Web Framework Flask

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out /  Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out /  Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out /  Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out /  Muuta )

Muodostetaan yhteyttä palveluun %s