class: center, middle # Knjižnica `bottle` ## Podatkovne baze 1 --- ### Spletni vmesnik v `bottle`-u
gradimo **prek funkcij** ``` import bottle @bottle.get('/') def pozdravi(): return 'Živjo!' bottle.run() ``` --- ### Možnost `debug` omogoča **izpisovanje napak** ``` bottle.run(debug=True) ``` ### Možnost `reloader` **samodejno požene**
strežnik ob spremembi kode ``` bottle.run(reloader=True) ``` ### Med razvojem imamo običajno vklopljeni
**obe možnosti** ``` bottle.run(debug=True, reloader=True) ``` --- ### Funkcije lahko sprejmejo tudi **argumente** ``` @bottle.get('/
/') def pozdravi(ime): return 'Živjo, {}!'.format(ime) ``` --- ### V spletne naslove lahko dajemo tudi **filtre** .bad-example[``` @bottle.get('/kvadriraj/
') def kvadriraj(n): n = int(n) return '{}^2 = {}'.format(n, n ** 2) ```] .good-example[``` @bottle.get('/kvadriraj/
') def kvadriraj(n): return '{}^2 = {}'.format(n, n ** 2) ```] --- ### Funkcije običajno vračajo **HTML** ``` @bottle.get('/
/') def pozdravi(ime): return 'Živjo,
{}
!'.format(ime) ``` --- ### Besedilo **iz predloge** ustvarimo s `template` ``` @bottle.get('/
/') def pozdravi(ime): return bottle.template('zivjo.tpl', ime=ime) ``` `views/zivjo.tpl` ```
Pozdravna stran za {{ime}}
Živjo,
{{ime}}
! ``` --- ### Za `%` pišemo poljubno **Python kodo** ``` vrstica besedila % a = 7 * 6 odgovor je {{a}} ``` - - - ``` vrstica besedila odgovor je 42 ``` --- ### Presledki **niso pomembni**,
vendar moramo zamike končati s `% end` ``` % if 3 < 7: % a = 42 % else: % a = 100 % end odgovor je {{a}} ``` - - - ``` odgovor je 42 ``` --- ### Vse vrstice brez `%` gradijo **izpis** ```
% for i in range(5):
{{i ** 2}}
% end
``` - - - ```
0
1
4
9
16
``` --- ### Za **skupne dele predlog** uporabimo `rebase` .bad-example[``` To je moja prva stran. ```] .bad-example[``` To je moja druga stran. ```] --- ### Za **skupne dele predlog** uporabimo `rebase` .good-example[``` {{!base}} ```] .good-example[``` % rebase('osnova.tpl') To je moja prva stran. ```] .good-example[``` % rebase('osnova.tpl') To je moja druga stran. ```] --- ### S funkcijo `static_file` lahko ponujamo tudi
**statične datoteke** (slike, CSS stili, …) ``` @bottle.get('/static/
') def server_static(ime_dat): pot = '/pot/do/mape/z/datotekami' return bottle.static_file(ime_dat, root=pot) ``` --- ### Podatke vnašamo prek **obrazcev** ```
a:
b:
``` --- ### Podatke preberemo iz `request.query` ``` @bottle.get('/sestej/') def sestej(): a = bottle.request.query['a'] b = bottle.request.query['b'] return '{} + {} = {}'.format(a, b, a + b) ``` --- ### Vsi podatki so prenešeni **kot nizi** ``` @bottle.get('/sestej/') def sestej(): a = int(bottle.request.query['a']) b = int(bottle.request.query['b']) return '{} + {} = {}'.format(a, b, a + b) ``` --- ### **Unicode** moramo zahtevati eksplicitno .bad-example[``` @bottle.get('/pozdravi/') def pozdravi(): ime = bottle.request.query['ime'] return 'Živjo, {}!'.format(ime) ```] .good-example[``` @bottle.get('/pozdravi/') def pozdravi(): ime = bottle.request.query.getunicode('ime') return 'Živjo, {}!'.format(ime) ```] --- ### Obrazce, ki **spreminjajo** stanje,
pošiljamo z metodo **POST** ```
Da
Ne
``` --- ### Podatke, poslane prek POST poizvedb,
preberemo iz `request.forms` ``` @bottle.post('/glasuj/') def glasuj(): glas = bottle.request.forms['glas'] model.zabelezi_glas(glas) return 'Glas je bil uspešno zabeležen!' ``` --- ### Po uspešno izvedeni POST poizvedbi naredimo **preusmeritev** .bad-example[``` @bottle.post('/glasuj/') def glasuj(): glas = bottle.request.forms['glas'] model.zabelezi_glas(glas) return 'Glas je bil uspešno zabeležen!' ```] Če preusmeritve ne naredimo,
lahko osveževanje vodi do **večkratnih sprememb**. --- ### Po uspešno izvedeni POST poizvedbi naredimo **preusmeritev** .good-example[``` @bottle.post('/glasuj/') def glasuj(): glas = bottle.request.forms['glas'] model.zabelezi_glas(glas) bottle.redirect('/glasuj/') @bottle.get('/glasuj/') def glasuj_rezultat(): return 'Glas je bil uspešno zabeležen!' ```] --- ### Podatke si lahko shranjujemo
v **piškotke** na uporabnikovem računalniku ``` @bottle.post('/glasuj/') def glasuj(): piskot = bottle.request.get_cookie('glas') if piskot is None: glas = bottle.request.forms['glas'] model.zabelezi_glas(glas) bottle.response.set_cookie('glas', glas) bottle.redirect('/glasuj/') else: return 'Ne glasuj dvakrat!' ``` --- class: question, middle, center ## Primer