h5

Python Flask weppisovellukset. Palvelinpään ohjelmointi, Python Flask framework. Flask-tuotantoasennus.


En ollut tunnilla, joten näiden tehtävien tekeminen oli vähän hankalaa. Tein ensin joitakin asioita väärin, mutta mielestäni sain ne kuitenkin suurilta osin tehtyä oikein. En osaa yhtään Pythonia, joten siltä osalta tehtävät olivat todella hankalia.

Tehtävät löytyvät täältä: http://terokarvinen.com/2020/linux-palvelimet-2020-alkukevat-kurssi-ict4tn021-3010/

Aloitin tehtävien tekemisen siinä 8.18./10.18 ja lopetin 10.36/12.36.

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

Tässä tehtävässä tein ehkä väärin: aloin tekemään sitä sille omalle palvelimelleni, vaikka sen pystyi tekemään testinä omalla päätelaitteella.

Käytin tätä sivua: https://linuxize.com/post/how-to-install-flask-on-ubuntu-18-04/ apuna Flaskin asentamisessa.

Luo virtuaaliympäristö Flaskille:

  • cd /home
  • sudo mkdir my_flask_app
  • cd my_flask_app
  • (luo virtuaaliympäristö tällä komennolla:)
    • sudo python3 -m venv venv
  • (To start using this virtual environment, you need to activate it by running the activate script:)
    • source venv/bin/activate

Command promptin käyttäjästä tuli nyt (venv) -alkuinen.

Asenna Flask:

  • $ pip install Flask
    • -> lataus ei onnistunut, tuli PermissionError
  • $ sudo apt install python-flask # for Python 2.x
  • $ sudo apt install python3-flask # for Python 3.x  
  • $ pip install Flask –user
    • -> nyt onnistui
  • TESTAUS: $ flask –version
  • -> Flask 0.12.2 Python 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]

Eli flaskin asennus onnistui.

Seuraavaksi luo Hello World sovellus:

  • sudo nano hello
    • from flask import Flask
    • app = Flask(__name__)
    • @app.route(’/’)
    • def hello_world():
    •     return ’Hello World!’

Testaa Development Server:

  • $ export FLASK_APP=hello
  • $ flask run

Tämä ei toiminut, vaan tuli error-viesti.

  • Error: The file/path provided (hello) does not appear to exist.  Please verify the path is correct. If app is not on PYTHONPATH, ensure the extension is .py

Korjausyritys: poista se aiempi tiedosto ja luo uusi sudo nano hello.py. Mutta tämäkään ei auttanut.

Tässä vaiheessa kilautin kaverille, joka oli ollut tunnilla. Hän sanoi, että opettana sivulla on ohjeet tälle tehtävälle. *facepalm*

http://terokarvinen.com/2020/hello-flask-python-web-app/

  • $ sudo apt-get update
  • $ sudo apt-get -y install python3-flask
  • $ sudo apt autoremove
  • $ sudo nano hello.py
    • from flask import Flask
    • app = Flask(__name__)
    • @app.route(”/”)
    • def hello():
    • return ”Learn Flask at TeroKarvinen.com!”
    • app.run(debug=True)
  • -> selaimeen localhost:5000
    • -> unable to connect

Nyt tajusin tehneeni väärin, kun tein tämän omalle palvelimelleni enkä omalle paikalliselle koneelleni. Miten oma kannettavani mukama avaisi tuon sivun, jos kirjoitan selaimeen localhost:5000? Otin järkeni käteen ja tein kaiken edellä mainitun omalle koneelleni.

Ja voila! Nyt se onnistui!


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

Tälle tehtävälle löytyi myös ohjeet opettajan sivuilta: http://terokarvinen.com/2020/deploy-python-flask-to-production/

Tein tämän omalle palvelimelleni, jossa oli Apache2 jo asennettuna.

  • $ echo ”sssSSSsss” |sudo tee /var/www/html/index.html
  • For security, we create a separate user for our app. 
    • $ sudo adduser krissetest
    • lukitse se
      • $ sudo usermod –lock krissetest
    • Let’s add ourselves to users own group.
      • $ sudo adduser $(whoami) krissetest
  • log out ja log in jotta ryhmä aktivoituu

Seuraavaksi Name Based Virtual Host for Python Flask:

  • $ sudoedit /etc/apache2/sites-available/krissetest.conf
  • muuta opettajan antamaa tekstiä:
    • <VirtualHost *:80>
    •      ServerName hattu.emmavaittinen.social
    •      WSGIDaemonProcess krissetest user=krissetest group=krissetest threads=5
    •      WSGIScriptAlias / /home/krissetest/public_wsgi/krissetest.wsgi
    •      <Directory /home/krissetest/public_wsgi/>
    •              WSGIScriptReloading On
    •              WSGIProcessGroup krissetest
    •              WSGIApplicationGroup %{GLOBAL}
    •              Require all granted
    •      </Directory>
    • </VirtualHost>

Sitten laitetaan sivu toimimaan:

  • $ sudo a2ensite krissetest.conf
  • $ sudo a2dissite 000-default.conf
  • $ apache2ctl configtest
    • AH00526: Syntax error on line 33 of /etc/apache2/sites-enabled/000-default-le-ssl.conf:
    • SSLCertificateFile: file ’/etc/letsencrypt/live/hattu.emmavaittinen.social/fullchain.pem’ does not exist or is empty
    • Action ’configtest’ failed.
    • The Apache error log may have more information.
  • $ sudo apt-get -y install libapache2-mod-wsgi-py
  • $ sudo systemctl restart apache2
  • $ apache2ctl configtest
    • Apache2ctl configtest should say ”Syntax OK”. Any complaints about servername blah blah localhost are harmless. If there are actual errors, this usually tells the line number, too.

Katsotaan, mitä sivu sanoo nyt:

  • $ curl localhost
    • <!DOCTYPE HTML PUBLIC ”-//IETF//DTD HTML 2.0//EN”>
    • <html><head>
    • <title>403 Forbidden</title>
    • </head><body>
    • <h1>Forbidden</h1>
    • <p>You don’t have permission to access this resource.</p>
    • <hr>
    • <address>Apache/2.4.29 (Ubuntu) Server at localhost Port 80</address>
    • </body></html>

Luodaan sinne seuraavaksi kansio ja muutetaan käyttäjien oikeuksia:

  • $ sudo mkdir /home/krissetest/public_wsg
  • $sudo chown krissetest:krissetest /home/krissetest/public_wsgi
    • fixing the permissions, because normally we don’t go around sudoing in user’s home directories
  • $ sudo chmod g=rwxs /home/krissetest/public_wsgi
    • Let all users in terowsgi group edit the directory (g+rwx), and let’s keep the terowsgi group for new files and folders (g+s).

Seuraavaksi luodaan se tiedosto (tero.wsgin tilalle se krissetest.wsgi):

  • $ nano /home/terowsgi/public_wsgi/tero.wsgi
    • import sys
    • assert sys.version_info.major >= 3, ”Python version too old in tero.wsgi!”
    • sys.path.insert(0, ’/home/terowsgi/public_wsgi/’)
    • from hello import app as application

Katsotaan, mitä sivu sanoo nyt:

  • $ curl -s localhost|grep title
    • <title>404 Not Found</title>
  • $ tail -1 /var/log/apache2/error.log
    • [Sun Mar 01 09:41:03.771760 2020] [wsgi:error] [pid 2296:tid 140010145634048] [client 127.0.0.1:36652] Target WSGI script not found or unable to stat: /home/krissetest/public_wsgi/krissetest

Sitten luodaan se hello.py -tiedosto:

  • $ nano hello.py
    • from flask import Flask
    • app = Flask(__name__)
    • @app.route(”/”)
    • def hello():
    • return ”Learn Flask at TeroKarvinen.com!\n
    • # Removed the app.run line

Katsotaan, mitä sivu sanoo nyt:

  • $ curl localhost
    • error 404

Unohdin potkaista apachea:

  • $ sudo systemctl restart apache2

Uudestaan:

  • $ curl localhost
    • 500 internal server error
  • $ tail -1 /var/log/apache2/error.log
    • [Sun Mar 01 09:51:42.918946 2020] [wsgi:error] [pid 2589:tid 140297772435200] [remote 127.0.0.1:36656] ModuleNotFoundError: No module named ’flask’

Eli modduli Flaskia ei ole aseennettu, joten asennetaan se:

  • $ sudo apt install python3-flask

Jos nyt toimisi:

  • $ curl localhost
    • ”Learn Flask at TeroKarvinen.com!”

Hurraa!


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

Tässä kohtaa voin sanoa, ettei minulla ollut oikein yhtään hajua mitä olin tekemässä. Opettajan sivuilta löytyi tekstiä muoteista, mutta ne eivät jotenkin auenneet minulle. Tein tehtävän kuitenkin jotenkin ja toivottavasti edes jotenkin oikein.

Apuna käytin: http://terokarvinen.com/2020/flask-templates/

  • $ cd /home/krissetest
  • $ sudo mkdir templates
  • $ cd templates/
  • $ sudo nano 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)
  • $ sudo nano base.html

Testaus:

  • $ python3 templates-flask.py
    •  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
    •  * Restarting with stat
    •  * Debugger is active!
    •  * Debugger PIN: 133-662-181

En tietenkään päässyt katsomaan sitä nyt, kun se ei ollut minun omalla koneellani pyörimässä eikä se tullut, kun menin nettisivulle.


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

Tämä tehtävä oli kanssa hankala, koska en osaa yhtään Pythonia. Tajusin, mitä siinä piti tehdä (samalla tavalla kuin a)-tehtävässä), mutten tiennyt, miten koodia piti muokata, jotta sen saisi toimimaan. Kokeilin tätä vähän eri tavalla. Löysin netistä valmiin koodin, jonka avulla sain jotakin tapahtumaan, kun kirjoitin selaimeen localhost:5000.

Kokeilin tällaista koodia:

from flask import rFlask
app = Flask(__name__)

@app.route(”/”)

def is_from_browser(user_agent):
return user_agent.browser in [
     ”camino”,
     ”chrome”,
     ”firefox”,
     ”galeon”,
     ”kmeleon”,
     ”konqueror”,
     ”links”,
     ”lynx”,
     ”msie”,
     ”msn”,
     ”netscape”,
     ”opera”,
     ”safari”,
     ”seamonkey”,
     ”webkit”,
 ]

app.run(debug=True)

Eli jotakin tapahtui, mutta ei kuitenkaan sitä, mitä tehtävässä käskettiin tekemään.

Jätä kommentti

Design a site like this with WordPress.com
Aloitus