Linux palvelimet harjoitus 5 ICT4TN021-5

Sisältö:

  1. Oma “Hello World Ohjelma Flask testipalvelimella
  2. Tuotantotyyppinen asennus Python Flaskista (Apache mod_wsgi)
  3. Tietueitten luku Postgre-tietokannasta Flaskilla

“Hello World” Flask testipalvelimella

Alustavat ohjelmat joita vaaditaan, sain tällä komennolla:
‘sudo apt-get -y install python3 ipython3 python3-flask curl’

Tämän jälkeen loin flask kansion ja sinne hello.py tiedoston.
‘mkdir flask’
‘cd flask’ – mennään flask kansioon, jonne hello.py luodaa
‘nano hello.py’

Tiedostoon sisällöksi:

from flask import Flask
app = Flask(__name__)

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

if __name__ == ‘__main__’:
app.run(host=’0.0.0.0′, port=5000)

Eli flaskista tuodaan flask ja laitetaan app nimiseen muuttujaan. App:in reitti tulee ‘/’ eli tämä on viittaus sivulle jossa tiedosto pyörii. Eli jos ‘/’ lisäksi olisi hello (/hello) löytyisi  sivu (http://0.0.0.0:5000/hello).
Sisällä funktio hello_world ajetaan ja se palauttaa tekstin “Hello World”. Lopussa tiedosto ajetaan 0.0.0.0 osoitteessa ja portti 5000.

Tiedoston luonnin jälkeen minun piti vielä ajaa tiedosto komennolla:
‘python3 hello.py’

Nyt pitäisi olla tälläinen näkymä, sivulla ‘http://0.0.0.0:5000/’ tai ‘http://localhost:5000’

HelloWorld0.1

2.Tuotantotyyppinen asennus Python Flaskista (Apache mod_wsgi)

Aikaisempien ohjelmien lisäksi tarvitsin Apache.
‘sudo apt-get -y install apache2’

Seuraavaksi hankin wsgi modin, jolla voin ajaa pythonia apache palvelimelta komennolla:
‘sudo apt-get -y install libapache2-mod-wsgi-py3’

Sitten tein wsgi tiedoston samaan kansioon kuin hello.py eli flask kansioon:
‘nano hello.wsgi’

Sisällöksi:

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/xubuntu/flask/’)
from hello import app as application

 

Loin virtualhostin komennolla:
‘sudoedit /etc/apache2/sites-available/hello.conf’

Tiedostoon sisällöksi:

## /etc/apache2/sites-available/hello.conf
<VirtualHost *>
ServerName rane.example.com

WSGIDaemonProcess hello user=xubuntu group=xubuntu threads=5
WSGIScriptAlias / /home/xubuntu/flask/hello.wsgi

<Directory /home/xubuntu/flask/>
WSGIProcessGroup hello
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On

Require all granted
</Directory>
</VirtualHost>

Huom! Varmista, että tiedosto polut ja tiedosto nimet ovat samat mitä olet itse käyttänyt. Esim user= on xubunutu koska se on käyttäjäni nimi.

Sitten tein hello.conf oletukseksi komennoilla:
‘sudo a2dissite 000-default.conf’
‘sudo a2ensite hello.conf’

Uudelleenkäynnistin apache2:n komennolla:
‘sudo service apache2 restart’

HUOM! Että 1. kohta on tehty ja että kaikkien tiedosto nimet ja polut ovat oikein.

helloworld0.2

Vakuutin itseni komennolla:
‘curl -sI localhost|grep Server’

Joka näyttää että serverinä toimii apache

proof

3.Tietueitten luku Postgre-tietokannasta Flaskilla

Alusavasti asensin itse PostgreSQL:n komennolla:
‘sudo apt-get -y install postgresql’
Tein databasen ja käyttäjän:
‘sudo -u postgres createdb xubuntu’
‘sudo -u postgres createuser xubuntu’

Huom!Käytä xubuntu:n sijasta omaa käyttäjänimeäsi.

‘psql’ komennolla tietokanta käynnistyi ja tietokantaan pystyi luomaan pöytiä ja niihin tietoa. Miltein samalla tavalla kuin muihinkin sql tietokantoihin.

Seuraavaksi loin Tero Karvisen esimerkin mukaisen tavan jolla tietoa haetaan ja laitetaan tietokantaan.

Hankitaan sqlalchemy ja psycopg2 modit:
‘sudo apt-get -y install python3-flask-sqlalchemy python3-psycopg2’

Muokataan hello.py:

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
app.config[‘SQLALCHEMY_DATABASE_URI’] = ‘postgresql:///xubuntu’
app.config[‘SECRET_KEY’] = ‘k377AglooNex+932.asdjReajeIxane436’

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 hellos (id SERIAL PRIMARY KEY, name VARCHAR(160) UNIQUE);”)
sql(“INSERT INTO hellos(name) VALUES (‘Bonjour’) ON CONFLICT (name) DO NOTHING;”)
sql(“INSERT INTO hellos(name) VALUES (‘Hola’) ON CONFLICT (name) DO NOTHING;”)
sql(“INSERT INTO hellos(name) VALUES (‘Moi’) ON CONFLICT (name) DO NOTHING;”)
sql(“INSERT INTO hellos(name) VALUES (‘Hello’) ON CONFLICT (name) DO NOTHING;”)

@app.route(“/”)
def hello():
return “Hello World! <a href=’/hellos’>List of different hellos</a>\n”

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

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

Eli aluksi luon yhteyden tietokantaan, sitten luon itse pöydän tietokantaan ja tiedot sinne, jos niitä ei vielä ole. Sitten tulostan ‘/’ sivulle vain “Hello World!”:in ja linkin toiselle sivulle (/hellos) ja /hellos sivulle tuon tiedot tietokannastamme.

Esimerkissä käytetään templateja, joten niin minäkin eli tein flask kansioon ‘templates’ kansion johon tein hellos.html ja base.html

Hellos.html laitoin:

{% extends “base.html” %}

{%block title%} Hellos {%endblock title%}

{% block contents %}
<h1>Hellos</h1>
{% for hello in hellos %}
<p>{{ hello.name }}</p>
{% endfor %}
{% endblock contents %}

Eli Sivulle tulee Hellos otsikkona ja <p> kohtaan kaikki hellosin sisältämät tiedot, yksi kerrallaan, kiitos for loopin.

Sitten base.html vain täytteeksi (huom ei väliä)

<!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>

Huom! Jos saat 500 internal server erroria, yksi mahdollinen virhe on voinut tulla hello.py muokatessa, jos sisennykset eivät ole oikein. Tämä vain yksi asia jonka itse koin tehdessäni.

Lopulta restarttasin apachen ja lopputulos oli tämä.

localhellossecondhellos

Lähteet:

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

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

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

Leave a comment