Serverside-programmering, templating og sesjonshåndtering.
Serveren som driver det hele
Flask er et lettvekts Python-rammeverk for webutvikling. Det er perfekt for å lære backend fordi det er enkelt å komme i gang med, men kraftig nok for seriøse applikasjoner. Du installerer det med pip install flask, og en minimal app er bare noen linjer:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hjem():
return 'Velkommen til min Flask-app!'
if __name__ == '__main__':
app.run(debug=True)Appen kjører nå på http://localhost:5000. Her er @app.route() dekoratøren som definerer URL-ruter, funksjonen returnerer innhold til brukeren, og debug=True gir bedre feilmeldinger og automatisk omlasting.
Ruter kan reagere på ulike HTTP-metoder. Du angir dem med methods=['POST'], og kan ha GET, POST, PUT og DELETE på samme eller ulike ruter. Ruter kan også ta URL-parametere: @app.route('/produkt/<int:produkt_id>') fanger et tall fra URL-en, mens <string:brukernavn> fanger en tekst. Query-parametere, som /sok?q=flask, hentes med request.args.get('q', ''), der det andre argumentet er en standardverdi hvis parameteren mangler. Slik kan én Flask-app betjene mange ulike URL-er med ulik logikk.
Jinja2-maler for dynamisk HTML
Å returnere ren tekst er greit til å begynne med, men ekte sider trenger HTML – og gjerne dynamisk HTML. Til det har Flask malsystemet Jinja2. Malene må ligge i en mappe som heter templates, og statiske filer som CSS i en mappe som heter static. Du sender data til en mal med render_template:
return render_template('velkomst.html', brukernavn=navn)I selve malen bruker du to typer spesialsyntaks. Doble krøllparenteser viser variabler: <h1>Hei, {{ brukernavn }}!</h1>. Prosent-taggene styrer logikk. En løkke skrives {% for produkt in produkter %} ... {% endfor %}, og en betingelse skrives {% if bruker_innlogget %} ... {% else %} ... {% endif %}.
Det kraftigste trekket er mal-arv, som lar deg dele felles struktur. Du lager en base.html med navigasjon og bunntekst, og definerer «hull» med {% block content %}{% endblock %}. Hver underside extends basen og fyller inn blokkene med sitt eget innhold. Slik slipper du å gjenta header og footer på hver side. Du lenker også til statiske filer med {{ url_for('static', filename='style.css') }}, som genererer riktig URL. Jinja2 gjør at backend og frontend smelter sammen til ferdige HTML-sider servert fra Python.
Skjemaer, POST og sessions
Nå skal vi ta imot data fra brukeren. Et HTML-skjema med method="POST" sender innholdet til en Flask-rute. På serveren henter du verdiene med request.form.get('navn'). En god vane er å validere – hvis et felt mangler, kan du vise en feilmelding med flash() og sende brukeren tilbake med redirect(url_for('kontakt')). Slik fanger du feil før de skaper problemer.
Men hvordan husker serveren hvem du er mellom forespørsler? HTTP er nemlig tilstandsløst – hver forespørsel står for seg selv. Løsningen er sessions. En session lar deg lagre brukerdata mellom forespørsler, for eksempel om noen er innlogget. For å bruke sessions må appen ha en secret_key, som brukes til å signere session-dataene sikkert.
En enkel innlogging fungerer slik: når brukeren sender riktig brukernavn og passord, lagrer du det i sessionen med session['brukernavn'] = brukernavn. På andre sider kan du da sjekke if 'brukernavn' in session for å avgjøre om brukeren er logget inn, og vise ulikt innhold deretter. For å logge ut fjerner du verdien fra sessionen. Med dette har du de fire byggesteinene i backend: ruter, maler, skjemaer og sessions – nok til å bygge en hel webapplikasjon i Flask.
Oppsummering
Vi bygde serveren som driver nettsiden med Flask. Ruter defineres med @app.route(), kan ta ulike HTTP-metoder og fange URL- og query-parametere. For dynamisk HTML bruker vi Jinja2-maler i templates-mappen, med {{ }} for variabler, {% %} for løkker og betingelser, og mal-arv via extends/block for å dele felles struktur.
Vi tar imot brukerdata gjennom skjemaer med request.form.get() og validering via flash og redirect. Og fordi HTTP er tilstandsløst, husker vi innlogging med sessions, som krever en secret_key. Med ruter, maler, skjemaer og sessions har du fundamentet for en komplett Flask-applikasjon. I neste kapittel kobler vi frontend og backend til en fullstack-applikasjon.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.