Flask įrengimas ir maršrutai

Skip to content

Tai mašinu versta tekstas, kuriame gali būti klaidų!

Info

Didžiausia dalis konfigūracijos buvo paimta iš čia: Flask Quickstart

GitHub?

Prašome įkelti kodą į GitHub!

Patikrinkite komandų kanalą, kad gautumėte informacijos apie GitHub Classroom, ten turėsite rasti nuorodą į saugyklą, kurį galite klonuoti kaip pradinį projektą.

Truputis Teorijos 💤😴

Fun Fact: Hvorfor heter det Flask? 🤔

Iš pradžių Flask buvo tik balandžio pirmosios pokštas (tai tik pokštas, brolau). Tai buvo sukurta kaip pokštas, paremtas jau esamu „Bottle“ pavadinimo rėmu, bet vėliau tapo taip populiaru, kad buvo paversta tikru rėmu! (Šaltinis: Wikipedia)

Visų pirma, kas yra Flask? Flask yra lengvasis (lightweight) karkasas (framework) internetinių programų kūrimui. Nors jis yra lengvasis, tai nereiškia, kad jis yra prastas! Priešingai, tai iš tiesų antras populiariausias Python karkasas interneto karkasų srityje. Pirmąją vietą užima Django.

Trumpai tariant: Flask suteikia galimybę sukurti interneto serverį!

Kai dirbote su HTML/CSS/JavaScript praėjusiais metais, jūs tiesiog „paleidote“ HTML puslapius naršyklėje. Lygiai taip pat, kai kūrėte Python programas, jūs tiesiog paleisdavote failus VS Code.

Bet dabar mes sukursime interneto serverį, t. y. „back-end“ (didelis terminas, aš žinau 🤓). Šis naudoja Python, kad „pateiktų“ HTML puslapius vartotojui.

Web serveris? Tiekia tinklalapius? Hæ? 😭

Ar kada nors svarstėte, kas iš tikrųjų vyksta, kai einate į, pavyzdžiui, https://youtube.com? Ne?

Įsivaizduokite, kad įrašote tinklalapio adresą naršyklėje, kaip gaunate visą informaciją apie turinį, kaip atrodo tinklalapis ir t.t.?

Atsakymas: žiniatinklio serveris! 🖥️

Vartotojas (t.y. jūs) prašo parodyti youtube.com. Taigi, siunčiate „request“ į žiniatinklio serverį ir klausiate:

  • 📞 „Labas, aš norėčiau pamatyti YouTube tinklalapį, ar galite jį man atsiųsti?“
  • 🖥️ „Aha, YouTube? Aš jį jums atsiųsiu!“ (pradedamas siųsti daugybė informacijos)
  • 📞 „Ačiū labai, aš matau tinklalapį!“

Warning

Tai nėra tiksli mokslinė paaiškinimas.

Taigi, kažkas turi užduotį atsiųsti tinklalapį vartotojui. Ten įsijungia žiniatinklio serveris, t.y. Flask programėlė.

Dalis 1 – Montavimas

Installasjon av programvaren er en enkel prosess, men det er viktig å følge instruksjonene nøye for å unngå problemer. Før du begynner, sørg for at datamaskinen din oppfyller minimumskravene.

Systemkrav

  • Operativsystem: Windows 10 eller nyere, macOS 10.15 eller nyere, Linux (Ubuntu 20.04 eller nyere)
  • Prosessor: Intel Core i5 eller AMD Ryzen 5
  • Minne: 8 GB RAM
  • Lagringsplass: 20 GB ledig plass

Installasjonssteg

  1. Last ned installasjonsprogrammet fra https://example.com/download.
  2. Dobbeltklikk på installasjonsprogrammet for å starte installasjonen.
  3. Følg instruksjonene på skjermen.
  4. Når installasjonen er fullført, start programmet.

Hvis du opplever problemer under installasjonen, kan du finne hjelp på vår nettside eller kontakte vår supportavdeling på support@example.com.


Programvaren krever en lisensnøkkel for å aktiveres. Du mottar lisensnøkkelen på e-post etter kjøpet. Skriv inn lisensnøkkelen når du blir bedt om det under oppstart av programmet.

PyCharm? Null problem!

Jeigu dirbate su PyCharm, galite tiesiog rasti projekto tipą „Flask“ ir sukurti projektą. Taip galite pereiti tiesiai prie 2 dalies. Kituose kodo rengykliuose greičiausiai turėsite įdiegti Flask rankiniu būdu. Vis tiek gali būti naudinga perskaityti tai, kas parašyta čia!

Atidarykite terminalą. Patikrinkite, ar komandų eilutė nukreipta į teisingą aplanką.

Įveskite terminale: pip install flask.
Tai įdiegs flask jūsų mašinoje, pip install naudojamas, kai reikia įdiegti išorinius „paketus“ arba „bibliotekas“.

Sukurkite naują failą pavadinimu app.py. Tada įdėkite šį kodą į šį failą:

# importai
from flask import Flask

# sukurkite flask serverį
app = Flask(__name__)

# sukuriame „maršrutą“ pagrindiniam puslapiui, kuris yra "/"
@app.route("/")
def hello():
    return "Hello World!"

# šiuo metu mes naudojame tai tik programos paleidimui
if __name__ == "__main__":
    app.run(debug=True)

Ką daro šis kodas!?

Pirmiausia turime importuoti Flask. Jei jums tai nepavyksta, galbūt padarėte 2 žingsnį neteisingai.

Po to turime sukurti app, tai yra „web serveris“, į kurį galime siųsti „requests“. Čia yra daug terminų, bet svarbiausia žinoti, kad tai programa, kuri gali siųsti ir gauti duomenis.

Info

Prašome kintamąjį pavadinti “app”. Techniškai galite jį pavadinti kaip nors kitaip, bet tada negaliu būti atsakingas, jei kažkas taps painiu! ☝️🤓

Po to turime funkciją su „route“. Su tuo grįšime vėliau. Bet route yra tiesiog kažkas, kas priima šiek tiek informacijos ir siunčia kažką kita.

Galiausiai paleidžiame programą naudodami app.run(). debug=True tiesiog praneša Flask, kad jis turi atspausdinti papildomą informaciją apie vykstančius dalykus, įskaitant tai, kas vyksta negerai. Kai norite paskelbti Flask programą, nepamirškite pakeisti į debug=False.

Paleiskite programą. Terminale turėtumėte pamatyti nuorodą: http://127.0.0.1:5000. Sekite ja, spustelėdami ją arba įvesdami į naršyklę, kas pasirodo?

> [!ERROR]- Nieko nevyksta!
> 
> - Ar atlikote 2 žingsnį?
> - Ar įdiegėte Python?

Del 2 - Paprastos Maršrutai

Dabar, kai turime pagrindinę programėlę, pažiūrėsime į pirmąjį Flask konceptą: „Maršrutai“!

“Route”, kas tai yra?

„Route“, arba „kelias“ yra vieta, kur galite nukrypti svetainėje. Pavyzdžiui, galite turėti svetainė.lt/pagalba, tada „/pagalba“ yra route.

Easy Užduotis 1 – Pagrindiniai maršrutai

Leiskime pridėti pagrindinį maršrutą. Sukursime maršrutą, kuris pateiks jums anekdotą, jei įrašysite /joke į svetainės adresą.

Čia turėsime panaudoti naują Python koncepciją, kurios dar nematėte! Dekoratorius. Tai speciali funkcija, kuri modifikuoja arba praplečia jau esamos funkcijos funkcionalumą, nekeičiant funkcijos.

Pažvelkite į šį kodą:

@app.route("/joke")
def joke():
    # Dette er en enkel rute som returnerer en vits.
    # Tai paprastas maršrutas, kuris grąžina anekdotą.
    return "Why did the chicken cross the road? Buck if I know!"

Čia matote, kad pridėjome @app.route("/joke"). Šis dekoratorius praneša mūsų app programai, kad ši funkcija turi būti route su verte /joke.

Pridėkite šį kodą po @app.route("/"). Pabandykite paleisti kodą, kas atsitinka? Šiuo metu nieko! Tačiau viskas, ko jums reikia norint gauti tą nuostabiai juokingą anekdotą, yra įrašyti http://127.0.0.1:5000/joke. Tada pranešite žiniatinklio serveriui, kad turite gauti iš /joke.

Løsning: Hele koden så langt
# imports
from flask import Flask

# opprett en flask server
app = Flask(__name__)

# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
    return "Hello World!"

# ny rute for å hente en vits
@app.route("/joke")
def joke():
    return "Why did the chicken cross the road? Buck if I know!"

# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
    app.run(debug=True)

Išspręsti: visa koda iki šiol

# imports
from flask import Flask

# sukurkite flask serverį
app = Flask(__name__)

# sukuriame "maršrutą" pagrindiniam puslapiui, kuris yra "/"
@app.route("/")
def hello():
    return "Hello World!"

# naujas maršrutas, skirtas gauti anekdotą
@app.route("/joke")
def joke():
    return "Why did the chicken cross the road? Buck if I know!"

# šiuo metu mes naudojame tai tik programai paleisti
if __name__ == "__main__":
    app.run(debug=True)

Vėliau pažiūrėsime, kaip per juos galime siųsti visus tinklalapius Level 2 lygyje.

Easy Užduotis 2 – Maršrutai su parametrais

Maršrutai nebūtinai turi būti statiški. Mes iš tiesų galime siųsti tai, ką vadiname parametrais į maršrutus.

Pavyzdžiui, sukursime tinklalapio maršrutą, kuris pasveikina įvestą vardą.

Žr. šį kodą:

@app.route("/hello/<name>")
def hello_name(name):
    # Grėtingas pavyzdys
    return "Hello " + name

Čia naudojame krokodilo skliaustelius, kad nurodytume, jog tai yra parametras. <name> šiuo atveju gali priimti bet kokias reikšmes.

Įdėkite šį kodą į app.py, paleiskite kodą, eikite į naršyklę ir pabandykite šį:

http://127.0.0.1:5000/hello/Bob.

Kas atsitinka? Pabandykite ir kitus vardus!

Løsning: Hele koden så langt
# imports
from flask import Flask

# opprett en flask server
app = Flask(__name__)

# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
    return "Hello World!"

# ny rute for å hente en vits
@app.route("/joke")
def joke():
    return "Why did the chicken cross the road? Buck if I know!"

# hei på deg!
@app.route("/hello/<name>")
def hello_name(name):
    return "Hello " + name

# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
    app.run(debug=True)

YouTube eksempel

Jeigu pažiūrėsime ankstesnį YouTube pavyzdį, galbūt galite įsivaizduoti, kaip žiniatinklio serveris žino, kurį vaizdo įrašą turėtų parodyti.

Šiek tiek supaprastintai YouTube nuorodos atrodo taip:

https://www.youtube.com/watch?v=<video_id>

Čia <video_id> bus parametras, kuris praneša žiniatinklio serveriui, kurį vaizdo įrašą siųsti. Taigi, žiniatinklio serveris atsako už viską, ką vartotojas nori gauti.

Medium Užduotis 3 – Parametrų tipai

Šiuo metu, kai rašote parametrą su <parameter>, jo vertė visada interpretuojama kaip string tipo, t. y. tekstas.

Tipai? Kas tai yra?

Tipai – tai ne apie ką daug kalbėjome anksčiau, bet svarbiausia žinoti, kad ne visi kintamieji veikia vienodai.

Įsivaizduokite, kad jus prašoma sudėti du dramblius ir žodį „apelsinas“. Koks būtų atsakymas? Atsakymas yra tas, kad tai neveikia, nes tai neturi jokios prasmės nuo pat pradžių!

Python kalboje galime žiūrėti į tai taip:

drambliu_skaicius = 2
vaisius = "apelsinas"

print(drambliu_skaicius + vaisius) # ŠIS VEIKTI NEGALIS!!

Kodėl tai neveikia?!

Nes drambliu_skaicius ir vaisius yra du visiškai skirtingi tipai. Vienas yra skaičius (integer arba int profesionalia kalba), o kitas yra tekstas (string profesionalia kalba). Negalime sudėti int ir string!

Maršruto parametrai turi keletą savybių. Galime nurodyti parametro „tipą“!

Žr. šį kodą:

@app.route("/calculate/<int:num>")
def calculate(num):
    # Dette er en enkel rute som multipliserer tallet med 2.
    # Tai paprastas maršrutas, kuris padaugina skaičių iš 2.
    return str(num * 2)

Šis kodas priima skaičių ir padaugina jį iš 2.

Įdėkite šį kodą į app.py, paleiskite kodą, eikite į naršyklę ir pabandykite šį:

http://127.0.0.1:5000/calculate/3.

Ką gaunate atsakymu? Pabandykite ir kitus skaičius, pažiūrėkite, kas atsitiks!

Løsning: Hele koden så langt
# imports
from flask import Flask

# opprett en flask server
app = Flask(__name__)

# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
    return "Hello World!"

# ny rute for å hente en vits
@app.route("/joke")
def joke():
    return "Why did the chicken cross the road? Buck if I know!"

# hei på deg!
@app.route("/hello/<name>")
def hello_name(name):
    return "Hello " + name

# kalkulator!
@app.route("/calculate/<int:num>")
def calculate(num):
    return str(num * 2)

# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
    app.run(debug=True)

Apie return ir Flask

Galbūt pastebėsite, kad rašome return str(num * 2).

Flask visada tikisi gauti galiojantį HTTP atsakymą. Paprastas skaičius nėra galiojantis atsakymas. Flask tikisi gauti string, t. y. tekstą.

Papildoma informacija apie return ir Flask

Čia taip pat galite grąžinti statuso kodą, bet dabar apie tai nekalbėsime. Tai galite padaryti parašydami return "Hallo", 200. 200 reiškia tik tai, kad viskas praėjo gerai ir kaip tikėtasi. Jei norite sužinoti daugiau apie tai, ką reiškia statuso kodai, patikrinkite Wikipedia Status Codes.

int typen

Atkreipkite dėmesį, kad parametre čia parašyta <int:num>.

Parametrai gali būti rašomi taip: <type:pavadinimas>. Šiame kode tipas yra int, kuris yra profesinis terminas žodžiui integer, t. y. sveikasis skaičius.

Sąrašas tipų Flask

Tipas Kas tai yra? Pavyzdžiai
<string:name> (numatytasis) visas tekstas be / "heisann", "Bob", "Kåre"
<int:number> Teigiami sveiki skaičiai. 2, 4, 47, 214
<float:decimal> Dešimtainiai skaičiai (terminas: slankiojo kablelio skaičiai) 2.4, 3.7, 44.213
<path:value> Panašus į string, bet priima ir / "heisann/hoppsann"
<uuid:user_id> Priima “UUID” strings 550e8400-e29b-41d4-a716-446655440000

Svarbu prisiminti, kad pavadinimas po : gali būti bet koks.

Medium Užduotis 4 – Paprastas skaičiuotuvas

Leiskime šiek tiek patobulinti mūsų calculate maršrutą! Taip pat galite priimti daugiau parametrų maršrute! Pabandykite pridėti du parametrus prie calculate maršruto, vieną pavadinkite num1, o kitą num2. Tada sudėkite skaičius ir grąžinkite juos į interneto puslapį.

Løsning
@app.route("/calculate/<int:num1>/<int:num2>")
def calculate(num1, num2):
    return str(num1 + num2)

Hard Užduotis 5 – Išplėstas skaičiuotuvas

Galiausiai, pabandykite sukurti skaičiuotuvą, kuriame galėtumėte naudoti +, -, *, /.

Galite pasirinkti naudoti žodžius, tokius kaip add, subtract, arba simbolius.

Pabandykite išspręsti tai tik viena maršrutu! (Galėtumėte sukurti def add(num1, num2), bet mes norime, kad tai padarytumėte tik su def calculate).

Papildoma: įsitikinkite, kad dalyba iš nulio sukelia problemų.

Løsning
@app.route("/calculate/<int:num1>/<string:op>/<int:num2>")
def calculate(num1, op, num2):
    if op == "add":
        return str(num1 + num2)
    elif op == "subtract":
        return str(num1 - num2)
    elif op == "multiply":
        return str(num1 * num2)
    elif op == "divide":
        # Ekstra, kult hvis du husket dette! 😎
        if num2 == 0:
            return "Can't divide by zero!!"
        return str(num1 / num2)

Løsning: Hele koden
# imports
from flask import Flask

# opprett en flask server
app = Flask(__name__)

# vi lager en "rute" for hovedsiden som er "/"
@app.route("/")
def hello():
    return "Hello World!"

# ny rute for å hente en vits
@app.route("/joke")
def joke():
    return "Why did the chicken cross the road? Buck if I know!"

# hei på deg!
@app.route("/hello/<name>")
def hello_name(name):
    return "Hello " + name

# kalkulator!
@app.route("/calculate/<int:num1>/<string:op>/<int:num2>")
def calculate(num1, op, num2):
    if op == "add":
        return str(num1 + num2)
    elif op == "subtract":
        return str(num1 - num2)
    elif op == "multiply":
        return str(num1 * num2)
    elif op == "divide":
        # Ekstra, kult hvis du husket dette! 😎
        if num2 == 0:
            return "Can't divide by zero!!"
        return str(num1 / num2)

# for øyeblikket bruker vi bare dette for å starte programmet
if __name__ == "__main__":
    app.run(debug=True)

Papildomos užduotys

Oppgave 1: Beregn gjennomsnittlig hastighet

Oppgave: En bil kjører 300 km på 4 timer. Hva er gjennomsnittlig hastighet i km/t?

Løsning:
Gjennomsnittlig hastighet = Total distanse / Total tid
Gjennomsnittlig hastighet = 300 km / 4 timer = 75 km/t

Oppgave 2: Konverter temperatur

Oppgave: Konverter 25°C til Fahrenheit.

Løsning:
Fahrenheit = (Celsius * 9/5) + 32
Fahrenheit = (25 * 9/5) + 32 = 45 + 32 = 77°F

Oppgave 3: Areal av en sirkel

Oppgave: En sirkel har en radius på 5 cm. Hva er arealet?

Løsning:
Areal = π * radius²
Areal = π * 5² = π * 25 ≈ 78.54 cm²

Medium Užduotis E1 – Sveiki sveiki sveiki sveiki

Pakeiskite /hello maršrutą, kad jis pateiktų unikalią žinutę, priklausomai nuo to, kas sako „sveiki“.

Hard Užduotis E2 – Atsitiktinė anekdotas

Pakeiskite /joke maršrutą, kad jis gautų atsitiktinę anekdotą iš anekdotų sąrašo. (Jums nereikia daug, tiesiog parodykite, kad tai veikia)

Hard Užduotis E3 – (Dar) Išplėstas skaičiuotuvas

Pridėkite dar daugiau funkcijų prie savo skaičiuotuvo, pavyzdžiui, pakėlimą laipsniu (power), sinusą, kosinusą, ploto skaičiuoklę arba ką nors kito, ką sugalvosite.

Hard Užduotis E4 – Koks tikslas?

Išplėskite /joke maršrutą dar labiau, kad galėtumėte priimti juokelių „kategoriją“, kur galite įrašyti /joke/<kategorija> ir gausite tokio tipo juokelį. Jei įrašysite tik /joke, gausite atsitiktinį juokelį iš bet kurios kategorijos.

Hint

Pasirinkite naudoti kelis sąrašus (po sąrašą kiekvienai kategorijai) arba naudokite Python „Dictionary“. Skaitykite apie žodynus čia: Python Dictionaries