7. Innlogging med session
I denne delen skal du:
- bruke Flask sessions for å huske hvem som er logget inn
- lage skjemaer for innlogging og utlogging
- forenkle tweet-skjemaet slik at brukeren ikke trenger å skrive brukernavn
Hva er en session?
Section titled “Hva er en session?”En session er en måte å huske informasjon om en bruker mellom forespørsler. Flask lagrer session-data i en cookie i nettleseren.
Når en bruker logger inn, lagrer vi brukernavnet i session. Da kan vi hente det ut igjen på neste side.
Oppsett
Section titled “Oppsett”Importer session fra Flask og legg til en hemmelig nøkkel:
from flask import Flask, request, redirect, render_template, session
app = Flask(__name__)app.secret_key = "32b45edd-59a6-4252-b18f-b51bb8aeabfe" # En hemmelig nøkkel som trengs for sessionsTips: Det er litt uheldig om noen får tak i den hemmelige nøkkelen, du kan for eksempel lage en egen med UUID: https://www.uuidgenerator.net/.
Bruke session
Section titled “Bruke session”Session fungerer som en ordbok:
# Lagre en verdisession["brukernavn"] = "thorcc"
# Hente en verdibrukernavn = session.get("brukernavn")
# Slette en verdisession.pop("brukernavn")Oppgave: Oppdater rute for å lage bruker
Section titled “Oppgave: Oppdater rute for å lage bruker”Oppdater /lag-bruker slik at brukeren automatisk blir logget inn etter at kontoen er opprettet:
Løsningsforslag
@app.post("/lag-bruker")def lag_bruker(): brukernavn = request.values.get("brukernavn") twitter.lag_bruker(brukernavn) session["brukernavn"] = brukernavn return redirect("/")Oppgave: Rute for innlogging
Section titled “Oppgave: Rute for innlogging”Lag en POST-rute /logg-inn som:
- henter
brukernavnfra skjemaet - lagrer brukernavnet i session
- sender brukeren tilbake til forsiden
Løsningsforslag
@app.post("/logg-inn")def logg_inn(): brukernavn = request.values.get("brukernavn") session["brukernavn"] = brukernavn return redirect("/")Oppgave: Rute for utlogging
Section titled “Oppgave: Rute for utlogging”Lag en POST-rute /logg-ut som:
- fjerner brukernavnet fra session
- sender brukeren tilbake til forsiden
Løsningsforslag
@app.post("/logg-ut")def logg_ut(): session.pop("brukernavn", None) return redirect("/")Oppgave: Oppdater index-ruten
Section titled “Oppgave: Oppdater index-ruten”Oppdater index-ruten til å sende brukernavnet fra session til templaten:
@app.get("/")def index(): feed = twitter.lag_global_feed() brukernavn = session.get("brukernavn") return render_template("index.html", feed=feed, brukernavn=brukernavn)Oppgave: Oppdater tweet-ruten
Section titled “Oppgave: Oppdater tweet-ruten”Oppdater /ny-tweet til å hente brukernavn fra session i stedet for skjemaet.
Krav:
- Hent brukernavn fra
session.get("brukernavn") - Hvis ingen er logget inn, send brukeren tilbake til forsiden
Løsningsforslag
@app.post("/ny-tweet")def ny_tweet(): brukernavn = session.get("brukernavn") if brukernavn is None: return redirect("/")
tekst = request.values.get("tekst") bruker = twitter.finn_bruker(brukernavn) bruker.lag_tweet(tekst) return redirect("/")Oppgave: Oppdater index.html
Section titled “Oppgave: Oppdater index.html”Oppdater index.html til å:
- vise innloggingsskjema og “lag bruker”-skjema hvis ingen er logget inn
- vise brukernavn og utloggingsknapp hvis noen er logget inn
- bare vise tweet-skjemaet hvis noen er logget inn
- fjerne brukernavn-feltet fra tweet-skjemaet
Tips: Bruk {% if brukernavn %} for å sjekke om noen er logget inn.
Løsningsforslag
<!DOCTYPE html><html><head> <title>Twitter</title></head><body> <h1>Feed</h1>
{% if brukernavn %} <p>Logget inn som: {{ brukernavn }}</p> <form method="post" action="/logg-ut"> <button type="submit">Logg ut</button> </form>
<h2>Skriv tweet</h2> <form method="post" action="/ny-tweet"> <input type="text" name="tekst" placeholder="Hva skjer?"> <button type="submit">Tweet</button> </form> {% else %} <h2>Logg inn</h2> <form method="post" action="/logg-inn"> <input type="text" name="brukernavn" placeholder="Brukernavn"> <button type="submit">Logg inn</button> </form>
<h2>Lag ny bruker</h2> <form method="post" action="/lag-bruker"> <input type="text" name="brukernavn" placeholder="Brukernavn"> <button type="submit">Lag bruker</button> </form> {% endif %}
<h2>Tweets</h2> {% for tweet in feed %} <p> <a href="/bruker/{{ tweet.bruker.brukernavn }}"> <b>{{ tweet.bruker.brukernavn }}</b> </a>: {{ tweet.tekst }} </p> {% endfor %}</body></html>Hvordan sessions fungerer
Section titled “Hvordan sessions fungerer”- Når brukeren logger inn, lagrer Flask brukernavnet i en kryptert cookie
- Nettleseren sender cookien med hver forespørsel
- Flask dekrypterer cookien og gjør dataen tilgjengelig i
session - Når brukeren logger ut, slettes dataen fra cookien
Den hemmelige nøkkelen (secret_key) brukes til å kryptere cookien.