h5

h5

Tee kukin tehtävä alusta lähtien ja kirjaa samalla, vaikka olisit kokeillut tunnilla. Jos pidät propellihattua, katso kohta x.

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”.

e) Vapaaehtoinen. Tee palvelinohjelma, joka laskee jotain käyttäjän antamista luvuista. Painoindeksi, tonttunimesi, pisteytys salasanallesi tms. Tässä tarvitaan lomakkeita (forms) ja POST-pyyntöjen lukemista.

x) Propellivaihtoehto, vapaaehtoinen, korvaa muut kohdat. Julkaise hyödyllinen Flask-ohjelma, joka käyttää tietokantaa ja lomakkeita. Hyöty voi olla pienikin, mutta ohjelman tulee tehdä jotain järkevää. (OK: äänestä paras kissankuva, ilmoittaudu arpajaisiin, nallekarhujen lainausjärjestelmä. Ei käy: lue esimerkkitietueita foo ja bar tietokannasta.) Hauskaa koodailua!

a) Hello Flask! Tee Python Flask hei maailma kehitysympäristössä. Voit siis käyttää tuotantoon sopimatonta app.run(debug=True) ajoa.

Käytin materiaalina http://terokarvinen.com/2020/hello-flask-python-web-app/ ja asensin ohjeiden mukaiset paketit ja päivitykset

  • sudo apt-get update
  • sudo apt-get install -y apache2 pyhton3-flask curl

Tämän jälkeen loin kotihakemistoon hello.py tiedoston sisällöllä

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
	return "Learn Flask at TeroKarvinen.com!"

app.run(debug=True)

Tässä kohtaa oli jo identiteettivarkaus lähellä, mutta onneksi palomuurini oli enabloitu ja muu ulkomaailma oli eristetty palvelimestani!

Suoritin komenno python3 hello.py ja scripta lähti toimintaan! Hienoa! Suunnistin localhost:5000 osoitteeseen ja ihastelin Teron sivujen mainosta onnistuneesti.

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’).

Käytin pohjamateriaalina http://terokarvinen.com/2020/deploy-python-flask-to-production/ ja koostin täältä tarvittavat paketit ja komennot jotka suoritin heti alkuun-

  • sudo apt-get -y install libapache2-mod-wsgi-py3
  • sudo a2enmod userdir
  • sudo systemctl restart apache2
  • apache2ctl configtest

Homma toimi kuin junan vessa, configtesti halusi taas ServerNamea mutta sitä ei ollut tarpeen lisätä tehtävässä. Ignorasin siis varoituksen. Tämän jälkeen testasin vielä localhostissa että apache toimisi, ja sehän toimi avautumalla oletussivuun!

Lähdin luomaan uutta käyttäjää flaski härpäkettä varten, olihan aika saada haltuun ryhmäoikeudet!

  • sudo adduser jaaniwsgi
  • sudo usermod –lock jaaniwsgi
  • sudo usermod xubuntu jaaniwsgi

Lisäsin uuden käyttäjän flaskia varten ja lisäin oman pääkäyttäjäni jaaniwsgi ryhmään. Tämän jälkeen loin virtualhostin jotta wsgi ja tuleva python scripta saataisiin toimimaan.

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

##### Ja tiedostoon sisään tämä #######

<VirtualHost *:80>
        ServerName jaanionparas.com

        WSGIDaemonProcess jaaniwsgi user=jaaniwsgi group=jaaniwsgi threads=5
        WSGIScriptAlias / /home/jaaniwsgi/public_wsgi/jaani.wsgi

        <Directory /home/jaaniwsgi/public_wsgi/>
                WSGIScriptReloading On
                WSGIProcessGroup jaaniwsgi
                WSGIApplicationGroup %{GLOBAL}
                require all granted
        </Directory>
</VirtualHost>

Tässä siis määrittelin WSGI scriptan reloadauksen päälle, tähän ryhmät ja määrittelin vielä kansiot joita ei ollut tässä vaiheessa luotu.

Tämän jälkeen poistin apachen oletussivun käytöstä ja lisäsin oman uuden sivuni josta sitten tuli oletussivu.

  • sudo a2ensite jaaniwsgi.conf
  • sudo a2dissite 000-default.conf

Tässä kohtaa pystyin testaamaan jo sivustoani, sillä wsgi pömpelit asennettiin jo alussa! On hyvä käydä materiaali etukäteen läpi niin ei tule turhia virheitä vastaan, vaikka virheistähän oppii. curl localhost paljasti että jokin on tässä kohtaa pielessä, ja apachen error logi paljasti että konffaamani kansio puuttui.

Loin uuden kansion sudo mkdir /home/jaaniwsgi/public_wsgi komennolla ja tämän jälkeen aloin laittamaan käyttäjäoikeuksiaa kuntoon.

Aikasemmin olin jo lisännyt itseni jaaniwsgi ryhmään mutta ryhmäoikeudet eivät olleet vielä tulleet voimaan, tarkastin tämän groups komennolla. su – xubuntu komento korjasi tilanteen, vaihdoin itseni xubuntusta xubuntuun ja nyt jaaniwsgi ryhmä oli ryhmissäni kun koitin groups komentoa.

ls -ld public_wsgi kansioon kuitenkin paljasti että kansio on nyt rootin hallinnassa. Vaihdoin oikeudet tähän kansioon jaaniwsgi ryhmään komennolla

sudo chown jaaniwsgi:jaaniwsgi /home/jaaniwsgi/public_wsgi

Tämän jälkeen lisäsin kansioon ryhmäoikeuksia editoimiseen tiedostoihin ja kansioihin komennolla

sudo chmod g=rwxs /home/jaaniwsgi/public_wsgi

curlasin localhostia ja sain herjan puuttuvaasta sivusta: wsgi tiedostoni puuttui jonka olin aikaisemmin määritellyt. Loin uuden tiedoston sudo /home/jaaniwsgi/public_wsgi/jaani.wsgi komennolla ja lisäsin pätkän koodia.

import sys
assert sys.version_info.major >= 3, "Python version too old in jaani.wsgi!"

sys.path.insert(0, '/home/jaaniwsgi/public_wsgi/')
from hello import app as application

Curlasin localhostia testatakseni wsgin toimintaa.

$ curl localhost
<title>500 Internal Server Error</title>
$ tail /var/log/apache2/error.log 
ModuleNotFoundError: No module named 'hello'


Aikaisemmassa scriptassa määritettiin että hello.py olisi käytettävä scripta, ja tätä ei ollut luotu vielä. Kopioin a) osiossa luoma tiedostoni public_wsgi kansioon ja poistin lopusta app.run(debug=True) rivin . Tässä kohtaa päätin poistua rikolliselta polulta ja vaihdoin teron sivujen mainostuksen omaan sivuuni muokkaamalla hello.py:n return riviä. Kuin teinipoika minä kosketin itseni mukaan nimettyä tiedostoa touch jaani.wsgi komenolla jotta tiedosto autoreloadaisi itsensä.

Testasin uudelleen localhostissa sivuni toimintaa, nyt mainostin itseäni täällä! Sivusto toimi ja muutokset olivat voimassa.

c) Lisää tuotanto-Flaskiin muotit (templates).

Materiaalina käytin http://terokarvinen.com/2020/flask-templates/ sisältöä.

Loin uuden kansion ”Templates” public_wsgi kansioon ja tänne lisäsin uuden tiedoston base.html.

<!doctype html>
<html>
	<head>
		<title>Hello Templates</title>
		<meta charset="utf-8">
	</head>
	<body>
		<h1>{{ greeting }}</h1>
		<p>
			Harjoitus
			
		</p>
	</body>
</html>

Muokkasin olemassaolevaa hello.py tiedosta ja vaihdoin tämän sisällön tähän:

#!/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!")

Nyt hello.py palauttaisi tempate kansiosta tämän aikaisemman base.html filun.

Tilanne oli koskettava ja niin olin minäkin: touch jaani.wsgi . Tämän jälkeen navigoin localhostiin ja vastaan tuli sydäntälämmittävä tervehdys templateille.

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”.

Hetken tehtävänantoa pohdittuani tajusin että Sun IP ei viittaa aurinkoon tai oracleen vaan MINUUN.

Googlasin ”flask import request user_agent” joka vei minut https://stackoverflow.com/questions/9878020/how-do-i-get-the-user-agent-with-flask . Tässä kohtaa en oikein tiennyt että mitä vielä halutaan joten etsin sivulta user_agentilla tietoa.

flask.request.user_agent.string

Rivi vaikutti lupaavalta ja aikaisemmassa materiaalissa oli

We must import what we use. Render template is imported to main namespace, so we can call it just ”render_template()” instead of ”flask.render_template”.

joten muutin tämän komennon suoraan request.user_agent.stringiin ja kokeilin laittaa tämän returniin.

from flask import Flask, render_template, request

app = Flask(name)

@app.route(”/”)
def testi():
return request.user_agent.string

Koskettelin taas touchilla jaani.wsgiä ja reloadasin localhostini. Hyvä arvaukseni ja tekninen lukutaitoni tuottivat tulosta: Ruudulle lävähti user_agenttini tiedot!

Jätä kommentti

Design a site like this with WordPress.com
Aloitus