Eksempel: Filmsiden - Ruter med parametere
Filstruktur
|
- static (ny)
| |
| - nav.css (ny)
| - style.css (ny)
|
- templates
| |
| - mal.html (ny)
| - film.html (ny)
| - index.html
|
- app.py
- imdb_top250.json (ny)
- requirements.txt
- venv
| |
| -...
|
app.py
from flask import Flask, render_template
import json
app = Flask(__name__)
# -- Leser fil ---
fil = open("imdb_top250.json", encoding="utf-8") # må ha encoding="utf-8" for å tolke tegn som æ,ø,å i filen
filmliste = json.load(fil)
# ---
# -- Ruter --
@app.route("/")
def index():
return render_template("index.html", filmer=filmliste)
@app.route("/film/<id>")
def film(id):
# id er en string med 1 + plassering til film i listen
filmnummer = int(id) - 1 # konverterer id til et heltall (int) og trekker fra 1
return render_template("film.html", film=filmliste[filmnummer])
# ---
mal.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Filmsiden</title>
<link rel="stylesheet" href='{{url_for("static", filename="nav.css")}}'>
<link rel="stylesheet" href='{{url_for("static", filename="style.css")}}'>
</head>
<body>
<header>
<nav>
<a href="/">Hjem</a>
</nav>
</header>
<main>
{% block innhold %}
{% endblock %}
</main>
</body>
</html>
index.html
Denne siden inneholder en for-løkke som går gjennom listen filmer, og lager et listepunkt for hver film, listepunktet inneholder en lenke som peker på ruten /film/{{loop.index}}
, der loop.index
er antall ganger løkken har kjørt.
{% extends "mal.html" %}
{% block innhold %}
<h1>Filmsiden</h1>
<h2>Filmer</h2>
<ol>
{% for film in filmer %}
<li>
<!-- {{loop.index}} er en teller som teller hvor mange ganger løkka har kjørt (starter på 1) -->
<a href="/film/{{loop.index}}">{{film["navn"]}}</a>
</li>
{% endfor %}
</ol>
{% endblock %}
film.html
Når brukeren går inn på ruten /film/<id>
, får brukeren denne siden med informasjon om filmen som ligger på plass id - 1
i listen filmliste
fra app.py
.
{% extends "mal.html" %}
{% block innhold %}
<h1>{{film["navn"]}}</h1>
<img src='{{film["bilde"]}}' alt='Bilde av {{film["navn"]}}'>
<p>
{{film["beskrivelse"]}}
</p>
<ul>
<li>Dato: {{film["dato"]}}</li>
<li>Karakter: {{film["karakter"]}}</li>
</ul>
{% endblock %}
Eksperttips: film.html med all info
{% extends "mal.html" %}
{% block innhold %}
<h1>{{film["navn"]}}</h1>
<img src='{{film["bilde"]}}' alt="">
<p>
{{film["beskrivelse"]}}
</p>
<ul>
<li>Dato: {{film["dato"]}}</li>
<li>Karakter: {{film["karakter"]}}</li>
<li>Sjangere:
<ul>
{% for sjanger in film["sjangere"] %}
<li>{{sjanger}}</li>
{% endfor %}
</ul>
</li>
<li>
{% if film["regissører"]|length == 1 %}
Regissør: {{film["regissører"][0]}}
{% elif film["regissører"]|length == 2 %}
Regissører: {{film["regissører"][0]}} og {{film["regissører"][1]}}
{% else %}
Regissører: {{", ".join(film["regissører"])}}
{% endif %}
</li>
</ul>
<iframe width="600" height="400" src='{{film["trailer"]}}' frameborder="0"></iframe>
{% endblock %}