Interaktiv applikasjon!
Du skal lage en interaktiv applikasjon som løser et konkret behov for en bestemt målgruppe. Du skal bruke Python og Flask, kjøre applikasjonen som en Docker-container på en server i Proxmox, og vise innhold som kommer fra data eller brukerinput.
Eksemplene under er bare ment som inspirasjon. Prøv helst å finne på et eget konsept. Tenk på hvem som skal bruke løsningen, hvilket problem den løser, og hva som gjør den nyttig:
- værmelding for Sandnes med “husk paraply!”
- dagens sitat med innsending og stemmegivning
- busstider eller annen lokal informasjon
- kantine-app med dagens meny og kalender
- digitalt klippekort for kantinen
- skritteller-ledertavle
Vil du hente data fra et eksternt API (f.eks. værmelding eller busstider)?
Se Flask 2 - Public APIs for hvordan dere finner og bruker et offentlig API, inkludert autentisering og hvor mange forespørsler dere har lov til å gjøre. Sjekk dette før dere velger en idé som er avhengig av et eksternt API, siden noen API-er krever nøkkel eller har strenge begrensninger.
Forkunnskaper og rammer
Du kan grunnleggende Python, Jinja og Linux-terminalen. Du trenger en Debian- eller Ubuntu-server i Proxmox med Docker, samt rettigheter til å sette opp applikasjonen i et godkjent testmiljø. Ved publisering trenger du et domenenavn, DNS-oppslag og en reverse proxy med avtalt tilgang. Bruk opplysningene fra den som administrerer miljøet; lokale adresser og tilgangsavtaler følger ikke denne fagressursen.
Før du lager brukerinteraksjonen, prøver du skjemaeksemplet i Flask 1. Der ser du forskjellen på et GET-søk med request.args og et POST-skjema med request.form, og hvordan du håndterer tom input.
Valgfri infoskjerm i kantina
Hvis ideen din kan passe på en infoskjerm, kan du lage en egen route på /infoskjerm. Den kan vises på en skjerm i 1080x1920 (9:16), og bør være lett å lese på avstand. Dette er valgfritt. Lag bare denne visningen hvis det gir mening for applikasjonen din.
Mål for prosjektet
Når prosjektet er ferdig, skal du ha øvd på å:
- planlegge en løsning ut fra et brukerbehov
- beskrive hva løsningen skal gjøre, og lage et enkelt brukergrensesnitt
- bruke Flask-routes, Jinja-templates og data fra Python eller en datakilde
- bygge og starte applikasjonen som Docker-container på serveren
- dokumentere løsningen og vise hvordan den kan driftes videre
Del 1 - Ide og planlegging
Start med å velge et problem eller en målgruppe. Skriv et kort planleggingsdokument med:
- konseptnavn og en kort pitch
- målgruppe og hvilket behov du løser
- minst tre funksjonelle krav
- hvilke data som skal være dynamiske, og hvor de kommer fra
- skisse eller wireframe av hovedsiden og eventuelle ekstra visninger
- rekkefølgen på arbeidet og et kontrollpunkt for hver hoveddel
Usikker på hva konsept, målgruppe og funksjonelle krav betyr?
💡 Idé og krav forklarer de tre delene med eksempel og gir fire spørsmål du kan bruke for å sjekke om ideen er klar nok til å bygges.
Presenter ideen kort for en mulig bruker eller en annen som kan gi tilbakemelding før du går videre. Bruk tilbakemeldingene til å gjøre ideen tydeligere eller enklere.
Presenterer du for en tenkt oppdragsgiver?
🗣️ Kommunikasjon med oppdragsgiver viser hvordan du avklarer forventninger og forklarer en teknisk løsning uten sjargong.
Del 2 - Lag applikasjonen
Applikasjonen må:
- bruke Python og Flask
- ha en hovedroute og minst én annen route
- bruke minst én Jinja-template med variabler,
for-loop ogif-sjekk - vise innhold som kommer fra Python, JSON, database eller et API
- ha minst én tydelig brukerhandling som påvirker resultatet, for eksempel at brukeren sender inn et skjema, søker etter noe, filtrerer en liste, stemmer på et alternativ eller registrerer en oppføring
- ha feilhåndtering eller en tydelig visning når data ikke finnes
- fungere på enhetene målgruppen skal bruke
Du kan bruke JavaScript til små forbedringer, men hovedinnholdet skal genereres av serveren (Flask).
Fungerer grensesnittet for alle?
♿ Universell utforming viser tre konkrete ting å sjekke: kontrast, alt-tekst på bilder og tastaturnavigasjon.
Hvis du lager en infoskjerm
Innholdet på /infoskjerm skal genereres av Flask på serveren. Ikke bruk JavaScript til å hente hovedinnholdet etter at siden er lastet. Kontroller at visningen virker i nettleseren skjermen faktisk bruker.
Del 3 - Docker og publisering
Applikasjonen skal kjøres på serveren, ikke bare på din egen datamaskin.
- Lag en
Dockerfilesom bygger applikasjonen. - Lag en
requirements.txteller tilsvarende oversikt over avhengigheter. - Bygg et image og start containeren på Debian- eller Ubuntu-serveren.
- Test først applikasjonen lokalt på serveren, for eksempel med
curl http://127.0.0.1:APP-PORT. ByttAPP-PORTmed den publiserte containerporten. - Test deretter domenet gjennom reverse proxyen. Direkte tilgang fra andre maskiner og tilgang fra internett skal følge avtalene for testmiljøet. Ikke åpne flere porter enn løsningen trenger.
- Dokumenter kommandoene som trengs for å bygge, starte, stoppe og oppdatere løsningen.
Se Docker - Kom i gang, Bygg et image med Dockerfile og Docker - Publisere applikasjon. Compose er valgfritt: Kjør og oppdater appen med Compose.
Ekstra utfordring
Vil du automatisere byggingen og publiseringen, kan du gå videre til Docker - Publisere container med workflow. Dette er ikke et krav for grunnoppgaven.
Levering
Lever ved å pushe prosjektet til GitHub. Repositoryet skal inneholde:
- all kildekode, templates, CSS og eventuelt JavaScript
Dockerfileog avhengighetsfil- planleggingsdokument med ide, målgruppe, krav og skisser
- README med installasjon, oppstart og oppdatering
- lenke til den publiserte applikasjonen, eller navnet den har i et internt testmiljø, og en kort forklaring av hvordan den kjøres
- test- og feilsøkingslogg som viser hva du testet, hva som feilet og hvordan du rettet det
- kort refleksjon over hva som fungerte, hva som var vanskelig og hva du ville gjort videre
Usikker på hva som hører hjemme i README-en, eller hva som aldri skal committes?
📄 Repostruktur og README viser hva GitHub selv anbefaler at en README inneholder. 📄 .gitignore og hemmeligheter viser hvordan .gitignore og .env.example holder hemmeligheter ute av repositoryet, og hva du gjør hvis en likevel havner der.
Når du står fast
Følg feilen fra ytterst til innerst: test først Flask lokalt, deretter containeren på serveren, og til slutt domenet gjennom reverse proxyen. Les feilmeldingen og noter hva du har prøvd før du søker etter en løsning. Ressursene i Docker - Kom i gang, Bygg et image med Dockerfile, Kjør og oppdater appen med Compose og Docker - Publisere applikasjon forklarer både begrepene og kommandoene steg for steg.
README-filen skal være skrevet slik at andre kan sette opp prosjektet uten muntlig forklaring. Ta med forutsetninger, installasjon, miljøvariabler, kommandoer, test-URL-er og vanlige feilmeldinger. Ikke legg passord, API-nøkler eller annen sensitiv informasjon i repositoryet.
Vurderingskriterier
- Ide og brukerbehov: Konseptet er forståelig, begrunnet og tilpasset en målgruppe.
- Funksjonalitet: Applikasjonen har fungerende routes, interaksjon og dynamiske data.
- Brukergrensesnitt: Løsningen er ryddig, lesbar og tilpasset målgruppen.
- Teknisk løsning: Flask, Jinja og Docker er brukt på en hensiktsmessig måte.
- Drift og dokumentasjon: Applikasjonen kan startes på serveren, og andre kan følge dokumentasjonen.
- Testing og refleksjon: Du har testet løsningen og kan forklare valg, feil og forbedringer.
Ekstra utfordringer
Legg til lagring i database, bruk et eksternt API, lag administratorfunksjon, kjør automatiske tester, eller sett opp logging og backup. Velg utvidelser som støtter brukerbehovet, og få grunnfunksjonene til å virke først.