Edelliseen tehtävään Etusivulle Seuraavaan tehtävään

Anna Kröger 2020-03-01

Python Flask weppisovellukset

Tämä on Tero Karvisen Linux palvelimet -kurssin viidennen kotitehtävän raportti. Tässä linkki kurssisivulle.

Tehtävänanto (h5):

a) Hello Flask! Tee Python Flask hei maailma kehitysympäristössä. Voit siis käyttää tuotantoon sopimatonta app.run(debug=True) ajoa.
b) Tuotanto-Flask. Tee tuotantotyyppinen asennus Flaskista käyttäen Apachen WSGI-modulia. Kokeile, että pystyt muokkaamaan koodia ilman sudoa ja saat uuden version käyttöön käynnistämättä Apachea uudelleen. ('touch foo.wsgi').
c) Lisää tuotanto-Flaskiin muotit (templates).
d) Sun IP. Tee Flask-sivu, jolla näkyy tietoja käyttäjästä. Esimerkiksi request.user_agent.string, request.remote_addr. Muista "from flask import request".


a) Kehitys-Flask

Koko a-kohdan tein täysin Tero Karvisen Hello Flask -ohjeiden mukaan. Aluksi asensin Flaskin.

$ sudo apt-get install python3-flask

Loin suoraan käyttäjän kotihakemistoon hello.py tiedoston.

$ nano hello.py
						from flask import Flask
						app = Flask(__name__)
					
						@app.route("/")
						def hello():
							return "Ekan flaskin helloWorld!"
					
						app.run(debug=True)
					

Lopuksi laitoin ohjelman pyörimään komennolla, jonka jälkeen se näkyi selaimessa osoitteena http://127.0.0.1:5000/

$ python3 hello.py

b) Tuotanto-Flask

Koko b-kohdan tein täysin Tero Karvisen Deploy Python Flask to Production -ohjeiden mukaan.

Aloitin asentamalla Apachen.

$ sudo apt-get install apache2

Sen jälkeen muutin (samalla tavalla kuin aikaisemmisakin tehtävissä) alkuun Apachen oletusetusivua

$ echo "Uusi etusivu" | sudo tee /var/www/html/index.html

Seuraavaksi loin uuden käyttäjän (hyvällä salasanalla!), jonka heti luonnin jälkeen lukitsin, jotta sillä ei voisi enää kirjautua.

$ sudo adduser annawsgi

$ sudo usermod --lock annawsgi

Sitten lisäsin pääkäyttäjän, eli tässä xubuntun, juuri luomani käyttäjän ryhmään

$ sudo adduser xubuntu annawsgi

Vielä ei kuitenkaan näkynyt, että xubuntu-käyttäjä kuuluisi annawsgi-ryhmään, joten kirjauduin uudelleen sisään, mikä korjasi ongelman.

$ groups # ryhmää ei näy listassa

$ su xubuntu

$ groups # nyt ryhmä näkyi listassa

Tein Apachelle uuden .conf tiedoston.

$ sudoedit /etc/apache2/sites-available/annawsgi.conf
<VirtualHost *:80>
   ServerName anna.esimerkki.com        
   WSGIDaemonProcess annawsgi user=annawsgi group=annawsgi threads=5    
   WSGIScriptAlias / /home/annawsgi/public_wsgi/anna.wsgi
			
   <Directory /home/annawsgi/public_wsgi/>          
      WSGIScriptReloading On    
      WSGIProcessGroup annawsgi    
      WSGIApplicationGroup %{GLOBAL}    
      Require all granted
   </Directory>
</VirtualHost>

Tässä välissä asensin Apachen WSGI-moduulin.

$ sudo apt-get -y install libapache2-mod-wsgi-py3

Sitten otin uuden sivun käyttöön, ja vanhan pois käytöstä. Jotta kaikki muutokset tulisivat voimaan, uudelleenkäynnistin Apachen.

$ sudo a2ensite annawsgi.conf

$ sudo a2dissite 000-default.conf

$ sudo systemctl restart apache2

Sitten oli hyvä hetki tarkistaa, mitä siellä selaimessa tässä vaiheessa näkyi.

$ curl localhost

Teron ohjeita seuraten osasin tosin odottaa, että vastauksena sieltä tulisi "403 Forbidden". Lokeista katsoen (komennolla: tail -1 /var/log/apache2/error.log) ongelma näytti olevan /home/terowsgi/public_wsgi kansio, mikä ei tosin ollut sekään yllättävää, sillä sitä ei ole olemassa. Loin siis ensin kyseisen kansion annawsgi:n hakemistoon, minkä jälkeen annoin kaikille annawsgi-ryhmään kuuluville oikeudet muokata kansiota ja sen tulevaa sisältöä.

$ sudo mkdir /home/annawsgi/public_wsgi

$ sudo chown annawsgi:annawsgi /home/annawsgi/public_wsgi

$ sudo chmod g=rwxs /home/annawsgi/public_wsgi

Seuraavaksi loin .wsgi tiedoston

$ nano /home/annawsgi/public_wsgi/anna.wsgi
						import sys
						assert sys.version_info.major >= 3, "Python version too old in anna.wsgi!"
					
						sys.path.insert(0, '/home/annawsgi/public_wsgi/')
						from hello import app as application
					

Lopuksi loin vielä samanlaisen hello.py tiedoston, kuin a-kohdassakin.

$ nano /home/annawsgi/public_wsgi/hello.py
						from flask import Flask
						app = Flask(__name__)
					
						@app.route("/")
						def hello():
							return "Homma toimii!"
					
						# Removed the app.run line
					

c) Tuotanto-Flaskiin template

Koko c-kohdan tein täysin Tero Karvisen Flask Templates -ohjeiden mukaan.

Aluksi loin templates -kansion.

$ mkdir /home/annawsgi/public_wsgi/templates

Sen jälkeen loin templates-flask.py tiedoston.

$ nano /home/annawsgi/public_wsgi/templates-flask.py
						#!/usr/bin/python3
						"Return HTML templated page"
					
						from flask import Flask, render_template
					
						app = Flask(__name__)
					
						@app.route("/")
						def templated():
							return render_template("base.html", greeting="Hello Templates!")
					
						app.run(debug=True)
					

Lopuksi loin vielä templates -kansioon base.html tiedoston.

$ nano /home/annawsgi/public_wsgi/templates/base.html
						<!doctype html>
							<html>
								<head>
									<title>Hello Templates</title>
									<meta charset="utf-8">
								</head>
								<body>
									<h1>{{ greeting }}</h1>
									<p>
										Jeeeeeee!
									</p>
								</body>
							</html>
					

Viimeisenä askeleena vielä käynnistys, jonka jälkeen template näkyy selaimessa (localhost:5000)

$ python3 flask-templates.py

d) Käyttäjän tietoja näkyville

Muokkasin aikaisemmin tekemää hello.py teidostoa (kuvassa vasemmalla) sekä base.html template-tiedostoa (kuvassa oikealla).
Käynnistin hello.py koodin ja avasin selaimessa localhost:5000.

$ python3 hello.py tehtC

Käyttämäni lähteet

Karvinen, Tero: Oppitunnit 2020-02-27, Linux palvelimet -kurssi
http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/

Karvinen, Tero: 2020-02-26, Hello Flask - Write a Python Web App
http://terokarvinen.com/2020/hello-flask-python-web-app/

Karvinen, Tero: 2020-02-26, Deploy Python Flask to Production
http://terokarvinen.com/2020/deploy-python-flask-to-production/

Karvinen, Tero: 2020-02-26, Flask Templates
http://terokarvinen.com/2020/flask-templates/