Web-kehityksen Perusteet

HTML-Pohjat

Helppo
20 min

HTML-generointi on tärkeä osa perinteisiä web-sovelluksia joissa palvelin rakentaa HTML:n dynaamisesti esimerkiksi sen perusteella mitä käyttäjä on syöttänyt sovellukseen.

Vanha, vaarallinen tapa

Ennen vanhaan monet web-sovellukset rakensivat HTML:ää vain yhdistelemällä merkkijonoja. Tässä esimerkki "legacy" PHP-sovelluksesta joka palauttaa HTML:n joka sisältää käyttäjän syötteestä otetun hakusanan:

echo "<p>Hakutulokset haulle: " . $_GET('haku') . "</p>"

Jos käyttäjä menisi vaikka URL-osoitteeseen https://www.example.com/?haku=kissa, sovellus palauttaisi selaimeen HTML:n:

<p>Hakutulokset haulle: kissa</p>

Tärkein syy siihen miksi tämä on hirvittävän huono ja vaarallinen tapa rakentaa dynaamista HTML:ää, on että HTML:n rakenne ja HTML:ssä näytettävät tiedot menevät helposti sekaisin. Mitä jos käyttäjä olisikin mennyt tällaiseen URL-osoitteeseen? https://www.example.com/?haku=<script>alert('XSS')</script>

Silloinhan sovellus palauttaisi HTML:n jossa on JavaScript-koodia jonka ei ollut tarkoitus olla siellä.

<p>
  Hakutulokset haulle: 
  <script>
    alert('XSS')
  </script>
</p>

Tätä ilmiötä kutsutaan XSS-haavoittuvuudeksi josta voit oppia enemmän XSS-kurssilla.

Flaskin käyttäminen HTML-pohjien kanssa on melko suoraviivaista, ja se vaatii vain muutaman perusaskeleen.

Oikea tapa: Templaatit

Oikea tapa rakentaa dynaamista HTML:ää on käyttää templaattikirjastia kuten Jinja2 jota Flask käyttää natiivisti.

Jinja2-mallien käyttäminen Flask-sovelluksessa on suhteellisen helppoa. Tässä on lyhyt kuvaus siitä, miten voit käyttää Jinja2-malleja Flaskissa:

  1. Asenna Jinja2 Flaskin avulla: Jinja2 tulee yleensä asennettuna Flaskin kanssa, mutta varmista, että sinulla on uusin versio käytössäsi. Voit tarkistaa sen komennolla "pip show Flask".
  2. Luo Jinja2-mallit Flask-sovelluksessa: Luo Flask-sovelluksen "templates" -kansioon malli (mallit) käyttämällä Jinja2-syntaksia. Voit käyttää mallissa Jinja2:n templaattikieltä, joka tarjoaa erilaisia toimintoja kuten silmukoita, ehtoja ja muuttujia.
  3. Välitä tietoja malliin Flask-sovelluksessa: Voit siirtää tietoja Flask-sovelluksesta Jinja2-mallille käyttämällä Flaskin "render_template" -toimintoa. Tämä toiminto luo HTML-sivun, joka käyttää Jinja2-mallia ja välittää sille tietoja.
  4. Näytä malli selaimessa: Kun Flask-sovellus vastaanottaa pyynnön, se kutsuu näkymäfunktiota, joka käyttää render_template-toimintoa lähettääkseen HTML-sivun, joka on generoitu Jinja2-mallin avulla.

Yksinkertainen esimerkki

main.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html', nimi='Maailma')

if __name__ == '__main__':
    app.run(debug=True)

templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>Flask & Jinja2 Esimerkki</title>
</head>
<body>
    <h1>Hei, {{ nimi }}!</h1>
</body>
</html>

Harjoittele

Kokeile itse!

Valitettavasti Replit-palvelu on muuttnut lennosta eikä enää anna suorittaa näitä koodeja suoraan selaimessa. Voit klikata alla olevaa "Open in Replit" linkkiä ja avata koodin Replit-palvelussa. Meillä on työn alla etsiä Replitille korvaaja.

hakatemia pro

Valmis ryhtymään eettiseksi hakkeriksi?
Aloita jo tänään.

Hakatemian jäsenenä saat rajoittamattoman pääsyn Hakatemian moduuleihin, harjoituksiin ja työkaluihin, sekä pääset discord-kanavalle jossa voit pyytää apua sekä ohjaajilta että muilta Hakatemian jäseniltä.