Tehtävä H6

Tietokantaa käyttävä ohjelma

Tein tehtävän kotona pöytäkoneellani, jossa oli mm. Intel i5-3570K prosessori, 8GB RAM-muistia ja Asus GTX 1060 (6GB) näytönohjain. Xubuntua (18.04.3) käytin USB-tikulta kokeilutilassa.

Aloitin tehtävän tekemisen klo 10.3.2020 klo 20:30 (UTC +2). Xubuntun kello näytti 18:30 (UTC +0).

a) Tietokanta wepissä. Tee oma yksinkertainen, tietokantaa käyttävä ohjelma. Ohjelmalla tulee olla jokin käyttötarkoitus. Voit tehdä ohjelman muokkaamalla Teron koodia (muista lähdeviite).

b) Laita tietokantaohjelmasi toimimaan mod_wsgi:n kanssa.


Apachen ja Flaskin asennus ja testaus.

Päivitin paketit, asensin Apachen ja availin portin aiemmin tekemäni tehtävän H3 mukaisesti. Tein testisivuja ja testasin niiden toiminnan, kuten tuossa aiemmassa harjoituksessakin.

Asensin Flaskin aiemmin tehdyn tehtävän H5 mukaisesti. Testasin Flaskin toiminnan testiympäristössä, sekä tuotantotyyppisessä ympäristössä samalla tavalla kuin tehtävässä H5.



Tietokantaa käyttävän ohjelman luominen



Halusin luoda Fiilisseinän, johon käyttäjä voisi kirjoittaa viikonpäivän, fiiliksensä sekä oman nimimerkkinsä. Minulla oli xubuntu-käyttäjän kansiossa Flaskin testauksessa käyttämäni kansio nimeltä flask. Tein kyseiseen kansioon tiedoston nimeltä autoformed.py. Tiedostoon kopioin Tero Karvisen tekemän mallin mukaisen sisällön, jota hiukan muokkasin:

  GNU nano 2.9.3                                                                                                                    autoformed.py                                                                                                                              

#!/usr/bin/python3
"RSVP autoform"
# Copyright 2020 Tero Karvinen http://TeroKarvinen.com

from flask import Flask, render_template, flash, redirect
from flask_sqlalchemy import SQLAlchemy
from wtforms.ext.sqlalchemy.orm import model_form
from flask_wtf import FlaskForm
import wtforms

app = Flask(__name__)
db = SQLAlchemy(app)
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///autoformed.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECRET_KEY"] = "dUCF)mtd9MAoZ?;R|8*iB^.+TCV//0"

class Reply(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        Viikonpäivä = db.Column(db.String, nullable=False)
        Fiilis = db.Column(db.String, nullable=False)
        Nimimerkki = db.Column(db.String, nullable=False)

field_args = { "email": {"validators": [wtforms.validators.Email()]} }
ReplyForm = model_form(model=Reply, base_class=FlaskForm, db_session=db.session, field_args=field_args)

@app.before_first_request
def beforeFirstRequest():
        db.create_all()

@app.route("/", methods=["GET", "POST"])
def index():
        form = ReplyForm()

        if form.validate_on_submit():
                reply = Reply()
                form.populate_obj(reply)
                db.session.add(reply)
                db.session.commit()
                flash("Kiitos vastauksestasi ja mukavaa päivänjatkoa! :)")
                return redirect("/")
        replies = db.session.query(Reply)
        return render_template("replies.html", form=form, replies=replies)

def main():
        app.run(debug=True)

if __name__ == "__main__":
        main()

Seuraavaksi siirryin /xubuntu/flask/templates/ -kansioon, joka minulla oli valmiina aiemman Flaskin testauksen vuoksi. templates -kansiossa oli myös valmiina base.html -tiedosto, jonka sisällöksi koipioin Tero Karvisen sivuilla olevan mallin mukaiseksi. Muokkasin sisältöä sen jälkeen vielä hiukan:


<!doctype html>
<html lang=en>
        <head>
                <title>Fiilisseinä</title>
                <meta charset="utf-8">
        </head>
        <body>
                {% with messages = get_flashed_messages() %}
                {% if messages %}
                <ul class=flashes>
                        {% for message in messages %}
                        <li>{{ message }}</li>
                        {% endfor %}
                </ul>
                {% endif %}
                {% endwith %}

                {% block body %}
                <h1>Tervehdys!</h1>
                {% endblock %}
        </body>

</html>

Tämän jälkeen loin /xubuntu/flask/templates/ -kansioon tiedoston nimeltä replies.html. Tiedoston sisällön kipioin jälleen Tero Karvisen sivuilta, minkä jälkeen muokkasin sitä mieleisekseni:

{% extends "base.html" %}
{% block body %}
<h1>Mikä on tämän hetkinen fiiliksesi?</h1>
<form method=post action="/">
        {{ form.csrf_token }}
        {% for field in form if not field.name in ["csrf_token"] %}
                <p>{{ field.label }}: {{ field }} <b>{{ " ".join(field.errors) }}</b></p>
        {% endfor %}
        <input type="submit">
</form>

<h2>Vastaukset:</h2>
{% for reply in replies %}
<b>{{ reply.Viikonpäivä }}</b>
<p>{{ reply.Fiilis }}</p>
<p>{{ reply.Nimimerkki }}</p>

{% endfor %}

{% endblock %}



Tietokantaohjelman testaus



Nyt pääsin testaamaan ohjelman toimivuutta. Käynnistin ohjelman python3 autoformed.py -komennolla. Komentokehotteeseen tuli seuraavanlainen virheilmoitus:

sqlalchemy asentamatta.

Minulta puuttui sqlalchemy -moduuli. aloin etsimään sopivaa moduulia komennolla apt-cache search flask_sqlalchemy. Sain listan useista vaihtoehdoista, valitsin python3-flask-sqlalchemyn, jonka asensin komennolla sudo apt-get install python3-flask-sqlalchemy.

Koitin jälleen käynnistää tietokantaohjelmaa, mutta sain taas uuden virheilmoituksen.

wtforms asentamatta.

Minun täytyi vielä asentaa wtforms -moduuli. Etsin sitä komennolla apt-cache search wtforms. Sain taas useita vaihtoehtoja, joista valitsin python3-flashext.wtf:n. Asensin sen komennolla sudo apt-get install python3-flaskext.wtf.

Kokeilin taas käynnistää tietokantaohjelmaa, eikä uusia virheilmoituksia tullut. Kirjoitin selaimen osoiteriville localhost:5000, minkä jälkeen lomake avautui. Täytin vaaditut kentät pariin kertaan, ja kirjoittamani asiat tulostuivat sivulle. /xubuntu/flask/ -kansioon ilmestyi autoformed.db -nimiden tiedosto, mikä kaiketi piti sisällään tietokannan, joka oletettavasti täydentyi sitä mukaa kun kirjoitin lomakkeeseen uusia tietoja.

Fiilisseinä testiympäristössä.



Fiilisseinän kopiointi testiympäristöstä tuotantotyyppiseen ympäristöön



Kopioin testiympäristöstä /home/xubuntu/flask kaikki kolme tiedostoa (autoformed.py, base.html ja replies.html) kansioihin /home/joniwsgi/public_wsgi/ ja /home/joniwsgi/public_wsgi/templates/ (joniwsgi:n olin luonut aiemman Flask-testiasennuksen yhteydessä). joniwsgi-kansiossa olleeseen tiedostoon nimeltä joni.wsgi (Flaskin testiasennuksen jäljiltä), muokkasin tiedoston sisällöstä kohdan hello -> autoformed.

Tiedostot ja niiden lopulliset sijainnit käyvät paremmin ilmi alla olevasta kuvasta:

Siirrettyäni tiedostot testiympäristöstä tuotantotyypiseen ympäristöön, minun olisi pitänyt turvallisuussyistä poistaa autoformed.py tiedostosta debuggaus rivi. En ollut varma, miten kyseinen kohta poistetaan oiekaoppisesti, joten annoin sen olla. (def main riviä ei ollut tehtävän H5 Flask-harjoituksessa.)

Annoin komennon touch joni.wsgi, jotta muutokset tulisivat voimaan, minkä jälkeen käynnistin ohjelman komennolla python3 autoformed.py. Sain komentoriville alla olevan ilmoituksen.

/usr/lib/python3/dist-packages/flask_sqlalchemy/__init__.py:800: UserWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
  warnings.warn('SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.')
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

En ymmärtänyt mitä kyseinen teksti tarkoittaa. Jos jotain pitäisi arvata, niin veikkaisin kyseisen tekstin liittyvän debuggaukseen, mutta voin olla väärässäkin.

Kirjoitin selaimen osoiteriville localhost, minkä jälkeen Fiilisseinä avautui. Täydensin lomakkeen kohdat, ja täyttämäni tiedot tulostuivat ruudulle.

Fiilisseinä tuotantotyyppisessä ympäristössä.

Kansioon /joniwsgi/public_wsgi/ ilmestyi autoformed.db tietokantatiedosto. Totesin ohjelman toimivan, ja totesin tehtävän suoritetuksi.

Lopetin tehtävien tekemisen 11.3.2020 klo 2:40 (UTC +2). Xubuntun kello näytti aikaa 00:40 (UTC +0).



Lähteet:

Vastaa

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

WordPress.com-logo

Olet kommentoimassa WordPress.com -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

Create your website with WordPress.com
Aloitus
%d bloggaajaa tykkää tästä: