{"id":292,"date":"2020-12-22T16:09:54","date_gmt":"2020-12-22T16:09:54","guid":{"rendered":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/?post_type=chapter&#038;p=292"},"modified":"2020-12-28T01:48:09","modified_gmt":"2020-12-28T01:48:09","slug":"andmebaasid-front-end","status":"publish","type":"chapter","link":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/chapter\/andmebaasid-front-end\/","title":{"raw":"Andmebaasid (front-end)","rendered":"Andmebaasid (front-end)"},"content":{"raw":"Kui siiani lisasime ise andmeid andmebaasi, siis n\u00fc\u00fcd vaatame, kuidas luua veebivorm, nii et kasutaja saab sisestada andmeid ja need lisatakse andmebaasi.\r\n\r\nLisame faili blogi.py meetodid <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">methods=['GET', 'POST']<\/code>. Klassi defineerimise j\u00e4rele lisame j\u00e4rgneva rea:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">@app.route('\/postitused', methods=['GET', 'POST'])<\/pre>\r\nN\u00fc\u00fcd l\u00e4hme html-failide juurde. Meil l\u00e4heb ka n\u00fc\u00fcd vaja faili baas.html, mille sisu oli j\u00e4rgnev:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=\"UTF-8\"&gt;\r\n{% block head %} &lt;title&gt;Minu esimene veebileht&lt;\/title&gt; {% endblock %}\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n{% block body %} {% endblock %}\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\r\nKui seda faili mingil p\u00f5hjusel veel ei ole, tuleks see kausta <em>templates<\/em> luua.\r\n\r\nVeel loome <em>templates<\/em> kausta faili blogipostitused.html ja teeme veebivormi. Selleks vajaliku koodi kirjutame body-ossa ehk lisame faili j\u00e4rgneva sisu:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% extends 'baas.html' %}\r\n{% block body %}\r\n&lt;h1&gt;Postitused&lt;\/h1&gt;\r\n&lt;h2&gt;Kirjuta uus postitus: &lt;\/h2&gt;\r\n&lt;form action='\/postitused' method='POST'&gt;\r\nPealkiri: &lt;input type='text' name='pealkiri' id='pealkiri'&gt;\r\n&lt;br&gt;\r\nAutor: &lt;input type='text' name='autor' id='autor'&gt;\r\n&lt;br&gt;\r\nPostitus: &lt;input type='text' name='sisu' id='sisu'&gt;\r\n&lt;br&gt;\r\n&lt;input type='submit' value='Saada'&gt;\r\n&lt;\/form&gt;\r\n{% endblock %}<\/pre>\r\nSiin kirjutasime pealkirjad <em>Postitused<\/em> ja <em>Kirjuta uus postitus<\/em>, seej\u00e4rel lisasime veebivormi osa, kus on lahter nii autori, pealkirja kui ka postituse sisestamise jaoks. Pealkirja lahtrit defineerib n\u00e4iteks rida <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Pealkiri: &lt;input type='text' name='pealkiri' id='pealkiri'&gt;<\/code>. Lahtrite j\u00e4rel on nupp <em>Saada<\/em> <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;input type='submit' value='Saada'&gt;<\/code>.\r\n\r\nInfo kuvamiseks kasutame ts\u00fcklit, mille tulemusel kuvatakse k\u00f5ikide postituste pealkiri, autor ja sisu.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% for postitus in postitused %}\r\n&lt;h2&gt;{{ postitus.pealkiri }}&lt;\/h2&gt;\r\n&lt;h3&gt;Autor: {{ postitus.autor }}&lt;\/h3&gt;\r\n&lt;p&gt;{{ postitus.sisu }}&lt;\/p&gt;\r\n{% endfor %}<\/pre>\r\nFaili blogipostitused.html sisu on n\u00fc\u00fcd j\u00e4rgnev:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% extends 'baas.html' %}\r\n{% block body %}\r\n&lt;h1&gt;Postitused&lt;\/h1&gt;\r\n&lt;h2&gt;Kirjuta uus postitus: &lt;\/h2&gt;\r\n&lt;form action='\/postitused' method='POST'&gt;\r\nPealkiri: &lt;input type='text' name='pealkiri' id='pealkiri'&gt;\r\n&lt;br&gt;\r\nAutor: &lt;input type='text' name='autor' id='autor'&gt;\r\n&lt;br&gt;\r\nPostitus: &lt;input type='text' name='sisu' id='sisu'&gt;\r\n&lt;br&gt;\r\n&lt;input type='submit' value='Saada'&gt;\r\n&lt;\/form&gt;\r\n\r\n{% for postitus in postitused %}\r\n&lt;h2&gt;{{ postitus.pealkiri }}&lt;\/h2&gt;\r\n&lt;h3&gt;Autor: {{ postitus.autor }}&lt;\/h3&gt;\r\n&lt;p&gt;{{ postitus.sisu }}&lt;\/p&gt;\r\n{% endfor %}\r\n\r\n{% endblock %}<\/pre>\r\nN\u00fc\u00fcd on vorm olemas ja saame selle siduda andmebaasiga.\r\n\r\nLisame blogi.py failis importimisel <em>request<\/em> ja <em>redirect<\/em>.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">from flask import Flask, render_template, request, redirect<\/pre>\r\nN\u00fc\u00fcd seome vormi andmebaasiga.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">@app.route('\/postitused', methods=['GET', 'POST'])\r\ndef blogi():\r\n\u00a0 \u00a0 if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_pealkiri = request.form['pealkiri']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_autor = request.form['autor']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_sisu = request.form['sisu']\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_postitus = Postitus(pealkiri=p_pealkiri, autor=p_autor, sisu=p_sisu)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_postitus)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/postitused')\r\n\u00a0 \u00a0 else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_postitused = Postitus.query.order_by(Postitus.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('blogipostitused.html', postitused=koik_postitused) # teeb k\u00f5ik postitused veebis n\u00e4htavaks<\/pre>\r\nFaili blogi.py sisu on n\u00fc\u00fcd j\u00e4rgnev:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">from flask import Flask, render_template, request, redirect\r\nfrom flask_sqlalchemy import SQLAlchemy\r\nfrom datetime import datetime\r\n\r\napp = Flask(__name__)\r\n\r\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/postitused.db'\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\r\ndb = SQLAlchemy(app)\r\n\r\nclass Postitus(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    pealkiri = db.Column(db.String(100), nullable=False)\r\n    sisu = db.Column(db.Text, nullable=False)\r\n    autor = db.Column(db.String(20), nullable=False, default = 'N\/A')\r\n    aeg = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\r\n    def __repr__(self):\r\n\u00a0 \u00a0 \u00a0 \u00a0 return 'Postitus ' + str(self.id)\r\n\r\n@app.route('\/postitused', methods=['GET', 'POST'])\r\ndef blogi():\r\n    if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_pealkiri = request.form['pealkiri']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_autor = request.form['autor']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_sisu = request.form['sisu']\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_postitus = Postitus(pealkiri=p_pealkiri, autor=p_autor, sisu=p_sisu)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_postitus)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/postitused')\r\n    else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_postitused = Postitus.query.order_by(Postitus.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('blogipostitused.html', postitused=koik_postitused) # teeb k\u00f5ik postitused veebis n\u00e4htavaks\r\n\r\nif __name__ == \"__main__\":\r\n    app.run()<\/pre>\r\nKui k\u00e4ivitame app.py programmi Thonnys ja vaatame tulemust aadressilt <a href=\"http:\/\/127.0.0.1:5000\/postitused\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/127.0.0.1:5000\/postitused<\/a>, n\u00e4eb see v\u00e4lja selline:\r\n\r\n<img class=\"alignnone wp-image-372\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11.png\" alt=\"Blogipostituste n\u00e4ide\" width=\"700\" height=\"543\" \/>\r\n\r\nN\u00fc\u00fcd saame postitusi juurde lisada.\r\n\r\nKui lisame failid PythonAnywhere keskkonda, siis kausta <em>mysite<\/em> lisame failid blogi.py ja postitused.db, alamkausta <em>templates<\/em> blogipostitused.html ja baas.html.\r\n\r\n<img class=\"alignnone wp-image-373\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14.png\" alt=\"PythonAnywhere n\u00e4ide\" width=\"700\" height=\"266\" \/>\r\n\r\nJ\u00e4rgmisena valime \u00fclevalt men\u00fc\u00fcst <em>Web<\/em> ja kerime natuke allapoole, kuni on lehe keskel n\u00e4ha blokk <em>Code<\/em> jaotus <em>WSGI configuration file<\/em> ja vajutame vastavale lingile (iga\u00fchel on aadressis oma kasutajatunnus, meie n\u00e4ites on aadress \/var\/www\/kasutaja_pythonanywhwere_com_wsgi.py). Seal teeme muudatuse, nii et viimase rea algus oleks <em>from blogi import<\/em>.\r\n\r\nKui vajab meenutamist, kuidas t\u00e4pselt tegutseda keskkonnas PythonAnywhere, siis vaata alapeat\u00fckki <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/chapter\/pythonanywhere\/\">PythonAnywhere<\/a>. Kui k\u00f5ik \u00f5nnestus, siis peaksime tulemust n\u00e4gema aadressil <a href=\"https:\/\/kasutaja.pythonanywhere.com\/postitused\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/kasutaja.pythonanywhere.com\/postitused<\/a>, kus s\u00f5na <em>kasutaja<\/em> asemel on iga\u00fche oma kasutajanimi.\r\n<h2>N\u00e4ide arvudega<\/h2>\r\nN\u00fc\u00fcd oleme tuttavad n\u00e4itega, kus sisestatakse teksti, mida kuvatakse veebis. Saame kasutada aga ka teisi andmet\u00fc\u00fcpe. J\u00e4rgnevalt vaatame korrutamise n\u00e4itel, kuidas teha tehteid ja tulemusi kuvada. Kuigi \u00fcldiselt hoitakse andmebaasis algandmeid, toome m\u00f5lemad n\u00e4ited: esimesel juhul lisatakse andmebaasi arvud, mis korrutatakse, kuid korrutist ei lisata andmebaasi; teisel juhul lisatakse andmebaasi nii arvud kui ka korrutamise tulemus.\r\n\r\nLoome v\u00e4ikese andmebaasi arvud.db, kus on \u00fcks tabel, milles on kaks arvu, lisaks sisestamise aeg. Selleks loome faili arvutamine.py, kuhu lisame j\u00e4rgneva sisu:\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">from flask import Flask, render_template, request, redirect\r\nfrom flask_sqlalchemy import SQLAlchemy\r\nfrom datetime import datetime\r\napp = Flask(__name__)\r\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/arvud.db'\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\r\ndb = SQLAlchemy(app)\r\nclass Arvud(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    arv1 = db.Column(db.Integer, nullable=False)\r\n    arv2 = db.Column(db.Integer, nullable=False)\r\n    aeg = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\r\n    def __repr__(self):\r\n\u00a0 \u00a0 \u00a0 \u00a0 return 'Tehe ' + str(self.id)<\/pre>\r\nKuna tahame, et arvud sisestatakse veebivormi kaudu, siis kirjutame faili arvutamine.py ka vastava funktsiooni. Siin koodis on sees juba ka html-faili nimi arvutamine.html. Selle faili loome hiljem.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">@app.route('\/arvutamine', methods=['GET', 'POST'])\r\ndef arvud():\r\n    if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv1 = request.form['arv1']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv2 = request.form['arv2']\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_sisend = Arvud(arv1=p_arv1, arv2=p_arv2)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_sisend)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/arvutamine')\r\n    else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_arvud = Arvud.query.order_by(Arvud.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('arvutamine.html', arvud=koik_arvud)<\/pre>\r\nK\u00f5ige l\u00f5ppu lisame arendusserveri ja siluri k\u00e4ivitamise osa.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">if __name__ == \"__main__\":\r\n\u00a0 \u00a0 app.run(debug = True, use_debugger = False, use_reloader = False)<\/pre>\r\nN\u00fc\u00fcd loome andmebaasi. Kirjutame k\u00e4sureale <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from arvutamine import db<\/code>, siis <em>Enter<\/em> ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">db.create_all()<\/code>.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">&gt;&gt;&gt; from arvutamine import db\r\n&gt;&gt;&gt; db.create_all()<\/pre>\r\nKui k\u00f5ik \u00f5nnestus, tekkis arvutamine.py-ga samasse kausta fail arvud.db. N\u00fc\u00fcd loome kausta <em>templates<\/em> faili arvutamine.html (samas kaustas on ka eelnevalt loodud fail baas.html). K\u00f5igepealt kirjutame veebivormi osa.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% extends 'baas.html' %}\r\n{% block body %}\r\n&lt;h1&gt;Arvutame&lt;\/h1&gt;\r\n&lt;h2&gt;Sisesta arvud, mida korrutada.&lt;\/h2&gt;\r\n&lt;form action='\/arvutamine' method='POST'&gt;\r\n1. arv: &lt;input type='number' name='arv1' id='arv1'&gt;\r\n&lt;br&gt;\r\n2. arv: &lt;input type='number' name='arv2' id='arv2'&gt;\r\n&lt;br&gt;\r\n&lt;input type='submit' value='Saada'&gt;\r\n&lt;\/form&gt;<\/pre>\r\nSeej\u00e4rel saame kuvada ekraanile sisestatud arvud. Ka korrutamise saame teha siinsamas ts\u00fcklis. Sellisel juhul korrutamise tulemust andmebaasi ei lisata.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% for arv in arvud %}\r\n&lt;h2&gt;1. arv: {{ arv.arv1 }}&lt;\/h2&gt;\r\n&lt;h2&gt;2. arv: {{ arv.arv2 }}&lt;\/h2&gt;\r\n&lt;h1&gt;Tulemus on: {{ arv.arv1 * arv.arv2 }}&lt;\/h1&gt;\r\n{% endfor %}\r\n{% endblock %}<\/pre>\r\nN\u00fc\u00fcd k\u00e4ivitame arvutamine.py faili ja aadressil <a href=\"http:\/\/127.0.0.1:5000\/arvutamine\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/127.0.0.1:5000\/arvutamine<\/a> saab veebivormi kaudu arve sisestada. Kui sisestasime n\u00e4iteks 2 ja 3, on tulemus j\u00e4rgnev:\r\n\r\n<img class=\"alignnone wp-image-375\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13.png\" alt=\"Korrutamise n\u00e4ide\" width=\"700\" height=\"450\" \/>\r\n\r\nKui me tahame, et korrutis salvestatakse andmebaasi, kirjutame klassi Arvud juurde rea\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">arv3 = db.Column(db.Integer, nullable=False<\/code>).\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">class Arvud(db.Model):\r\n\u00a0 \u00a0 id = db.Column(db.Integer, primary_key=True)\r\n\u00a0 \u00a0 arv1 = db.Column(db.Integer, nullable=False)\r\n\u00a0 \u00a0 arv2 = db.Column(db.Integer, nullable=False)\r\n\u00a0 \u00a0 arv3 = db.Column(db.Integer, nullable=False)\r\n\u00a0 \u00a0 aeg = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\r\n\u00a0 \u00a0 def __repr__(self):\r\n\u00a0 \u00a0 \u00a0 \u00a0 return 'Tehe ' + str(self.id)<\/pre>\r\nFunktsioonis arvud aga lisame rea <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">p_arv3 = int(p_arv1) * int(p_arv2)<\/code> ning muudame vastavalt ka j\u00e4rgneva rea muutuja <em>uus_sisend<\/em> v\u00e4\u00e4rtust.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">def arvud():\r\n\u00a0 \u00a0 if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv1 = request.form['arv1']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv2 = request.form['arv2']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv3 = int(p_arv1) * int(p_arv2)\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_sisend = Arvud(arv1=p_arv1, arv2=p_arv2, arv3=p_arv3)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_sisend)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/arvutamine')\r\n\u00a0 \u00a0 else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_arvud = Arvud.query.order_by(Arvud.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('arvutamine.html', arvud=koik_arvud) # teeb k\u00f5ik postitused veebis n\u00e4htavaks<\/pre>\r\nKa failis arvutamine.html saame ts\u00fcklis kasutada muutujat arv3.\r\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% for arv in arvud %}\r\n&lt;h2&gt;1. arv: {{ arv.arv1 }}&lt;\/h2&gt;\r\n&lt;h2&gt;2. arv: {{ arv.arv2 }}&lt;\/h2&gt;\r\n&lt;h1&gt;Tulemus on: {{ arv.arv3 }}&lt;\/h1&gt;\r\n{% endfor %}<\/pre>\r\n&nbsp;","rendered":"<p>Kui siiani lisasime ise andmeid andmebaasi, siis n\u00fc\u00fcd vaatame, kuidas luua veebivorm, nii et kasutaja saab sisestada andmeid ja need lisatakse andmebaasi.<\/p>\n<p>Lisame faili blogi.py meetodid <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">methods=['GET', 'POST']<\/code>. Klassi defineerimise j\u00e4rele lisame j\u00e4rgneva rea:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">@app.route('\/postitused', methods=['GET', 'POST'])<\/pre>\n<p>N\u00fc\u00fcd l\u00e4hme html-failide juurde. Meil l\u00e4heb ka n\u00fc\u00fcd vaja faili baas.html, mille sisu oli j\u00e4rgnev:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;meta charset=\"UTF-8\"&gt;\r\n{% block head %} &lt;title&gt;Minu esimene veebileht&lt;\/title&gt; {% endblock %}\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n{% block body %} {% endblock %}\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>Kui seda faili mingil p\u00f5hjusel veel ei ole, tuleks see kausta <em>templates<\/em> luua.<\/p>\n<p>Veel loome <em>templates<\/em> kausta faili blogipostitused.html ja teeme veebivormi. Selleks vajaliku koodi kirjutame body-ossa ehk lisame faili j\u00e4rgneva sisu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% extends 'baas.html' %}\r\n{% block body %}\r\n&lt;h1&gt;Postitused&lt;\/h1&gt;\r\n&lt;h2&gt;Kirjuta uus postitus: &lt;\/h2&gt;\r\n&lt;form action='\/postitused' method='POST'&gt;\r\nPealkiri: &lt;input type='text' name='pealkiri' id='pealkiri'&gt;\r\n&lt;br&gt;\r\nAutor: &lt;input type='text' name='autor' id='autor'&gt;\r\n&lt;br&gt;\r\nPostitus: &lt;input type='text' name='sisu' id='sisu'&gt;\r\n&lt;br&gt;\r\n&lt;input type='submit' value='Saada'&gt;\r\n&lt;\/form&gt;\r\n{% endblock %}<\/pre>\n<p>Siin kirjutasime pealkirjad <em>Postitused<\/em> ja <em>Kirjuta uus postitus<\/em>, seej\u00e4rel lisasime veebivormi osa, kus on lahter nii autori, pealkirja kui ka postituse sisestamise jaoks. Pealkirja lahtrit defineerib n\u00e4iteks rida <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Pealkiri: &lt;input type='text' name='pealkiri' id='pealkiri'&gt;<\/code>. Lahtrite j\u00e4rel on nupp <em>Saada<\/em> <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">&lt;input type='submit' value='Saada'&gt;<\/code>.<\/p>\n<p>Info kuvamiseks kasutame ts\u00fcklit, mille tulemusel kuvatakse k\u00f5ikide postituste pealkiri, autor ja sisu.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% for postitus in postitused %}\r\n&lt;h2&gt;{{ postitus.pealkiri }}&lt;\/h2&gt;\r\n&lt;h3&gt;Autor: {{ postitus.autor }}&lt;\/h3&gt;\r\n&lt;p&gt;{{ postitus.sisu }}&lt;\/p&gt;\r\n{% endfor %}<\/pre>\n<p>Faili blogipostitused.html sisu on n\u00fc\u00fcd j\u00e4rgnev:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% extends 'baas.html' %}\r\n{% block body %}\r\n&lt;h1&gt;Postitused&lt;\/h1&gt;\r\n&lt;h2&gt;Kirjuta uus postitus: &lt;\/h2&gt;\r\n&lt;form action='\/postitused' method='POST'&gt;\r\nPealkiri: &lt;input type='text' name='pealkiri' id='pealkiri'&gt;\r\n&lt;br&gt;\r\nAutor: &lt;input type='text' name='autor' id='autor'&gt;\r\n&lt;br&gt;\r\nPostitus: &lt;input type='text' name='sisu' id='sisu'&gt;\r\n&lt;br&gt;\r\n&lt;input type='submit' value='Saada'&gt;\r\n&lt;\/form&gt;\r\n\r\n{% for postitus in postitused %}\r\n&lt;h2&gt;{{ postitus.pealkiri }}&lt;\/h2&gt;\r\n&lt;h3&gt;Autor: {{ postitus.autor }}&lt;\/h3&gt;\r\n&lt;p&gt;{{ postitus.sisu }}&lt;\/p&gt;\r\n{% endfor %}\r\n\r\n{% endblock %}<\/pre>\n<p>N\u00fc\u00fcd on vorm olemas ja saame selle siduda andmebaasiga.<\/p>\n<p>Lisame blogi.py failis importimisel <em>request<\/em> ja <em>redirect<\/em>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">from flask import Flask, render_template, request, redirect<\/pre>\n<p>N\u00fc\u00fcd seome vormi andmebaasiga.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">@app.route('\/postitused', methods=['GET', 'POST'])\r\ndef blogi():\r\n\u00a0 \u00a0 if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_pealkiri = request.form['pealkiri']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_autor = request.form['autor']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_sisu = request.form['sisu']\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_postitus = Postitus(pealkiri=p_pealkiri, autor=p_autor, sisu=p_sisu)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_postitus)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/postitused')\r\n\u00a0 \u00a0 else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_postitused = Postitus.query.order_by(Postitus.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('blogipostitused.html', postitused=koik_postitused) # teeb k\u00f5ik postitused veebis n\u00e4htavaks<\/pre>\n<p>Faili blogi.py sisu on n\u00fc\u00fcd j\u00e4rgnev:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">from flask import Flask, render_template, request, redirect\r\nfrom flask_sqlalchemy import SQLAlchemy\r\nfrom datetime import datetime\r\n\r\napp = Flask(__name__)\r\n\r\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/postitused.db'\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\r\ndb = SQLAlchemy(app)\r\n\r\nclass Postitus(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    pealkiri = db.Column(db.String(100), nullable=False)\r\n    sisu = db.Column(db.Text, nullable=False)\r\n    autor = db.Column(db.String(20), nullable=False, default = 'N\/A')\r\n    aeg = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\r\n    def __repr__(self):\r\n\u00a0 \u00a0 \u00a0 \u00a0 return 'Postitus ' + str(self.id)\r\n\r\n@app.route('\/postitused', methods=['GET', 'POST'])\r\ndef blogi():\r\n    if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_pealkiri = request.form['pealkiri']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_autor = request.form['autor']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_sisu = request.form['sisu']\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_postitus = Postitus(pealkiri=p_pealkiri, autor=p_autor, sisu=p_sisu)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_postitus)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/postitused')\r\n    else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_postitused = Postitus.query.order_by(Postitus.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('blogipostitused.html', postitused=koik_postitused) # teeb k\u00f5ik postitused veebis n\u00e4htavaks\r\n\r\nif __name__ == \"__main__\":\r\n    app.run()<\/pre>\n<p>Kui k\u00e4ivitame app.py programmi Thonnys ja vaatame tulemust aadressilt <a href=\"http:\/\/127.0.0.1:5000\/postitused\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/127.0.0.1:5000\/postitused<\/a>, n\u00e4eb see v\u00e4lja selline:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-372\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11.png\" alt=\"Blogipostituste n\u00e4ide\" width=\"700\" height=\"543\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11.png 993w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11-300x233.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11-768x596.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11-65x50.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11-225x174.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image11-350x271.png 350w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>N\u00fc\u00fcd saame postitusi juurde lisada.<\/p>\n<p>Kui lisame failid PythonAnywhere keskkonda, siis kausta <em>mysite<\/em> lisame failid blogi.py ja postitused.db, alamkausta <em>templates<\/em> blogipostitused.html ja baas.html.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-373\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14.png\" alt=\"PythonAnywhere n\u00e4ide\" width=\"700\" height=\"266\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14.png 1131w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14-300x114.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14-1024x389.png 1024w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14-768x292.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14-65x25.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14-225x86.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image14-350x133.png 350w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>J\u00e4rgmisena valime \u00fclevalt men\u00fc\u00fcst <em>Web<\/em> ja kerime natuke allapoole, kuni on lehe keskel n\u00e4ha blokk <em>Code<\/em> jaotus <em>WSGI configuration file<\/em> ja vajutame vastavale lingile (iga\u00fchel on aadressis oma kasutajatunnus, meie n\u00e4ites on aadress \/var\/www\/kasutaja_pythonanywhwere_com_wsgi.py). Seal teeme muudatuse, nii et viimase rea algus oleks <em>from blogi import<\/em>.<\/p>\n<p>Kui vajab meenutamist, kuidas t\u00e4pselt tegutseda keskkonnas PythonAnywhere, siis vaata alapeat\u00fckki <a href=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/chapter\/pythonanywhere\/\">PythonAnywhere<\/a>. Kui k\u00f5ik \u00f5nnestus, siis peaksime tulemust n\u00e4gema aadressil <a href=\"https:\/\/kasutaja.pythonanywhere.com\/postitused\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/kasutaja.pythonanywhere.com\/postitused<\/a>, kus s\u00f5na <em>kasutaja<\/em> asemel on iga\u00fche oma kasutajanimi.<\/p>\n<h2>N\u00e4ide arvudega<\/h2>\n<p>N\u00fc\u00fcd oleme tuttavad n\u00e4itega, kus sisestatakse teksti, mida kuvatakse veebis. Saame kasutada aga ka teisi andmet\u00fc\u00fcpe. J\u00e4rgnevalt vaatame korrutamise n\u00e4itel, kuidas teha tehteid ja tulemusi kuvada. Kuigi \u00fcldiselt hoitakse andmebaasis algandmeid, toome m\u00f5lemad n\u00e4ited: esimesel juhul lisatakse andmebaasi arvud, mis korrutatakse, kuid korrutist ei lisata andmebaasi; teisel juhul lisatakse andmebaasi nii arvud kui ka korrutamise tulemus.<\/p>\n<p>Loome v\u00e4ikese andmebaasi arvud.db, kus on \u00fcks tabel, milles on kaks arvu, lisaks sisestamise aeg. Selleks loome faili arvutamine.py, kuhu lisame j\u00e4rgneva sisu:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">from flask import Flask, render_template, request, redirect\r\nfrom flask_sqlalchemy import SQLAlchemy\r\nfrom datetime import datetime\r\napp = Flask(__name__)\r\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/arvud.db'\r\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\r\ndb = SQLAlchemy(app)\r\nclass Arvud(db.Model):\r\n    id = db.Column(db.Integer, primary_key=True)\r\n    arv1 = db.Column(db.Integer, nullable=False)\r\n    arv2 = db.Column(db.Integer, nullable=False)\r\n    aeg = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\r\n    def __repr__(self):\r\n\u00a0 \u00a0 \u00a0 \u00a0 return 'Tehe ' + str(self.id)<\/pre>\n<p>Kuna tahame, et arvud sisestatakse veebivormi kaudu, siis kirjutame faili arvutamine.py ka vastava funktsiooni. Siin koodis on sees juba ka html-faili nimi arvutamine.html. Selle faili loome hiljem.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">@app.route('\/arvutamine', methods=['GET', 'POST'])\r\ndef arvud():\r\n    if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv1 = request.form['arv1']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv2 = request.form['arv2']\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_sisend = Arvud(arv1=p_arv1, arv2=p_arv2)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_sisend)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/arvutamine')\r\n    else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_arvud = Arvud.query.order_by(Arvud.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('arvutamine.html', arvud=koik_arvud)<\/pre>\n<p>K\u00f5ige l\u00f5ppu lisame arendusserveri ja siluri k\u00e4ivitamise osa.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">if __name__ == \"__main__\":\r\n\u00a0 \u00a0 app.run(debug = True, use_debugger = False, use_reloader = False)<\/pre>\n<p>N\u00fc\u00fcd loome andmebaasi. Kirjutame k\u00e4sureale <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">from arvutamine import db<\/code>, siis <em>Enter<\/em> ja <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">db.create_all()<\/code>.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">&gt;&gt;&gt; from arvutamine import db\r\n&gt;&gt;&gt; db.create_all()<\/pre>\n<p>Kui k\u00f5ik \u00f5nnestus, tekkis arvutamine.py-ga samasse kausta fail arvud.db. N\u00fc\u00fcd loome kausta <em>templates<\/em> faili arvutamine.html (samas kaustas on ka eelnevalt loodud fail baas.html). K\u00f5igepealt kirjutame veebivormi osa.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% extends 'baas.html' %}\r\n{% block body %}\r\n&lt;h1&gt;Arvutame&lt;\/h1&gt;\r\n&lt;h2&gt;Sisesta arvud, mida korrutada.&lt;\/h2&gt;\r\n&lt;form action='\/arvutamine' method='POST'&gt;\r\n1. arv: &lt;input type='number' name='arv1' id='arv1'&gt;\r\n&lt;br&gt;\r\n2. arv: &lt;input type='number' name='arv2' id='arv2'&gt;\r\n&lt;br&gt;\r\n&lt;input type='submit' value='Saada'&gt;\r\n&lt;\/form&gt;<\/pre>\n<p>Seej\u00e4rel saame kuvada ekraanile sisestatud arvud. Ka korrutamise saame teha siinsamas ts\u00fcklis. Sellisel juhul korrutamise tulemust andmebaasi ei lisata.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% for arv in arvud %}\r\n&lt;h2&gt;1. arv: {{ arv.arv1 }}&lt;\/h2&gt;\r\n&lt;h2&gt;2. arv: {{ arv.arv2 }}&lt;\/h2&gt;\r\n&lt;h1&gt;Tulemus on: {{ arv.arv1 * arv.arv2 }}&lt;\/h1&gt;\r\n{% endfor %}\r\n{% endblock %}<\/pre>\n<p>N\u00fc\u00fcd k\u00e4ivitame arvutamine.py faili ja aadressil <a href=\"http:\/\/127.0.0.1:5000\/arvutamine\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/127.0.0.1:5000\/arvutamine<\/a> saab veebivormi kaudu arve sisestada. Kui sisestasime n\u00e4iteks 2 ja 3, on tulemus j\u00e4rgnev:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-375\" src=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13.png\" alt=\"Korrutamise n\u00e4ide\" width=\"700\" height=\"450\" srcset=\"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13.png 918w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13-300x193.png 300w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13-768x494.png 768w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13-65x42.png 65w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13-225x145.png 225w, https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-content\/uploads\/sites\/18\/2020\/12\/image13-350x225.png 350w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/p>\n<p>Kui me tahame, et korrutis salvestatakse andmebaasi, kirjutame klassi Arvud juurde rea\u00a0<code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">arv3 = db.Column(db.Integer, nullable=False<\/code>).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">class Arvud(db.Model):\r\n\u00a0 \u00a0 id = db.Column(db.Integer, primary_key=True)\r\n\u00a0 \u00a0 arv1 = db.Column(db.Integer, nullable=False)\r\n\u00a0 \u00a0 arv2 = db.Column(db.Integer, nullable=False)\r\n\u00a0 \u00a0 arv3 = db.Column(db.Integer, nullable=False)\r\n\u00a0 \u00a0 aeg = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\r\n\u00a0 \u00a0 def __repr__(self):\r\n\u00a0 \u00a0 \u00a0 \u00a0 return 'Tehe ' + str(self.id)<\/pre>\n<p>Funktsioonis arvud aga lisame rea <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">p_arv3 = int(p_arv1) * int(p_arv2)<\/code> ning muudame vastavalt ka j\u00e4rgneva rea muutuja <em>uus_sisend<\/em> v\u00e4\u00e4rtust.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">def arvud():\r\n\u00a0 \u00a0 if request.method == 'POST':\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv1 = request.form['arv1']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv2 = request.form['arv2']\r\n\u00a0 \u00a0 \u00a0 \u00a0 p_arv3 = int(p_arv1) * int(p_arv2)\r\n\u00a0 \u00a0 \u00a0 \u00a0 uus_sisend = Arvud(arv1=p_arv1, arv2=p_arv2, arv3=p_arv3)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.add(uus_sisend)\r\n\u00a0 \u00a0 \u00a0 \u00a0 db.session.commit()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return redirect('\/arvutamine')\r\n\u00a0 \u00a0 else:\r\n\u00a0 \u00a0 \u00a0 \u00a0 koik_arvud = Arvud.query.order_by(Arvud.aeg).all()\r\n\u00a0 \u00a0 \u00a0 \u00a0 return render_template('arvutamine.html', arvud=koik_arvud) # teeb k\u00f5ik postitused veebis n\u00e4htavaks<\/pre>\n<p>Ka failis arvutamine.html saame ts\u00fcklis kasutada muutujat arv3.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"bootstrap4\" data-enlighter-linenumbers=\"false\">{% for arv in arvud %}\r\n&lt;h2&gt;1. arv: {{ arv.arv1 }}&lt;\/h2&gt;\r\n&lt;h2&gt;2. arv: {{ arv.arv2 }}&lt;\/h2&gt;\r\n&lt;h1&gt;Tulemus on: {{ arv.arv3 }}&lt;\/h1&gt;\r\n{% endfor %}<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"author":29,"menu_order":8,"template":"","meta":{"pb_show_title":"on","pb_short_title":"","pb_subtitle":"","pb_authors":[],"pb_section_license":""},"chapter-type":[],"contributor":[],"license":[],"class_list":["post-292","chapter","type-chapter","status-publish","hentry"],"part":100,"_links":{"self":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/292","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters"}],"about":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/types\/chapter"}],"author":[{"embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/users\/29"}],"version-history":[{"count":10,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/292\/revisions"}],"predecessor-version":[{"id":449,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/292\/revisions\/449"}],"part":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/parts\/100"}],"metadata":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapters\/292\/metadata\/"}],"wp:attachment":[{"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/media?parent=292"}],"wp:term":[{"taxonomy":"chapter-type","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/pressbooks\/v2\/chapter-type?post=292"},{"taxonomy":"contributor","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/contributor?post=292"},{"taxonomy":"license","embeddable":true,"href":"https:\/\/web.htk.tlu.ee\/digitaru\/tarkvara2\/wp-json\/wp\/v2\/license?post=292"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}