Ohjausta on saatavilla huomenna perjantaina 8.3. klo 10:15 - 12,
maanantaina 11.3. klo 10-13 ja klo 20-21.
--
Tommi Lahtonen, tommi.j.lahtonen(a)jyu.fi, < https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fhazor.iki… >
Just when you get going, someone injects a dose of reality with a large needle.
Muistakaa pitää kurssin tehtäviin liittyvät gitlab/github-reponne
privaatteina. Erityisesti viikkotehtävä 4-6:n kanssa voi käydä hassusti,
jos laitatte julkiseen repoon Googlen autentikointiin liittyviä avaimia.
config.py-tiedostoa ei kannata lisätä mukaan repoon ollenkaan.
Eräälle ehti jo käydä huonosti eli alle tunnissa oli joku napannut tiedot
julkisesta reposta ja alkanut pystyttää opiskelijan nimissä
kryptovaluuttaa louhivia virtuaalikoneita googlen pilveen.
--
Tommi Lahtonen, tommi.j.lahtonen(a)jyu.fi, < https://eur03.safelinks.protection.outlook.com/?url=https%3A%2F%2Fhazor.iki… >
Setting a goal is not the main thing. It is deciding how you will go about achieving it and staying with that plan. - Tom Landry
Viikkotehtävä 2 on nyt arvioitu.
Oman arvionne näette täältä:
https://appro.mit.jyu.fi/cgi-bin/ties4080/ilmo/ilmo.cgi/omat
Aika monella oli urlien sisältö epävalidi. Urlit kannattaa rakentaa
tehtävänannossa vinkattua urllib.parse.urlencode-funktiota käyttäen:
https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode
Esimerkkejä:
https://docs.python.org/3/library/urllib.request.html#urllib-examples
esim.
#muista serialisointi json-muotoon, kos kyseessä muuta kuin string tai int
tila = {"foo": "bar", "taulukko": json.dumps([1,2,3,4,5]), "testi": 1}
querystring = urllib.parse.urlencode( json.dumps(tila) )
ja nyt querystring on seuraavanlainen:
'foo=bar&taulukko=%5B1%2C+2%2C+3%2C+4%2C+5%5D&testi=1'
Yksittäisen urlin osan voi koodata urllib.parse.quote_plus-funktiolla:
https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus
huomatkaa, että edellä oleva koodaus tosiaan koskee vain urleja. lomakkeen
hidden-kenttään saa vapaammin sijoittaa merkkijonoja, mutta sielläkin
pitää muista koodata html:n erikoismerkit. Jinja tekee tämän
automaattisesti.
Lisäksi sovelluksen tilan muistamiseen tarvitaan serialisointia, johon
myös oli suora vinkki tehtävänannossa. Ts. jos haluat tallentaa
monimutkaisempia rakenteita kuin pelkkiä merkkijonoja tai numeroita, on
rakenteesi serialisoitava merkkijonoksi:
https://appro.mit.jyu.fi/ties4080/luennot/python/#TOC18
--
Tommi Lahtonen, tommi.j.lahtonen(a)jyu.fi, < https://hazor.iki.fi/ >
Either I'm dead or my watch has stopped. -- last words of Groucho Marx
Viikkotehtävä 3:n ensimmäinen haaste on tehdä sivustolle kirjautuminen
käyttäen tietokannassa olevia tietoja. Tästä aiheesta löytyy nyt
lisämalleja:
hieman eri tapaan toteutettu autentikointiesimerkki:
http://users.jyu.fi/~tjlahton/cgi-bin/ties4080/ohjaus3/kirjaudu.cgi/http://users.jyu.fi/~tjlahton/cgi-bin/ties4080/ohjaus3/kirjaudu.pyhttp://users.jyu.fi/~tjlahton/cgi-bin/ties4080/ohjaus3/templates/kirjaudu2.…
ja sama tietokantapohjaisena:
https://appro.mit.jyu.fi/ties4080/ohjaus/ohjaus3/#TOC12
Jos haluaa hieman säästää aikaa ja vaivaa viikkotehtävä 3:ssa, niin
saattaa kannattaa asentaa omalle koneelle mysql-tietokanta ja tehdä
kehitys suoraan sen avulla. mysql:n asentamiseen ja konfigurointiin ei
valitettavasti ole lisäohjeita.
Toinen vaihtoehto on tehdä kehitys sqlite3-tietokannan avulla, mutta tämän
siirtäminen pythonanywhereen ja muuntaminen käyttämään mysql-tietokantaa
vaatii hieman lisäsäätöjä, jotka kaikki on kyllä kerrottu
pääteohjaustehtävässä.
Teitte kummalla tavalla tahansa, niin testatkaa sovellustanne
pythonanywheressa ajoissa älkääkä vasta maanantai-iltana. Tässä voi aina
tulla mutkia matkaan eikä niiden selvittely ole kivaa viime minuuteilla.
--
Tommi Lahtonen, tommi.j.lahtonen(a)jyu.fi, < https://hazor.iki.fi/ >
To err is human; to really foul things up requires a computer.
SQLite3 ei osaa tehdä caseinsensitive-vertailua skandinaavisilla merkeillä
eli esim. UPPER('BÄÄ') == UPPER('bää') on sen mielestä epätosi. Jotta saa
asiat toimimaan myös skandeilla haluamallaan tavalla pitää tehdä oma
lajittelufunktio. Esim. seuraavassa käytetään yhtä sqliten
sisäänrakennetuista collation (lajittelu) -funktioista ja yritetään hakea
kaikki käyttäjät joiden etunimi olisi esim. Källe tai källe, mutta tämä ei
toimi eikä auta vaikka käyttäisi upper-funktiota:
SELECT *
FROM user
WHERE etunimi = 'källe' COLLATE NOCASE
tämän NOCASE-funktion voi siis korvata omalla python-funktiolla, jonka
jälkeen edellä oleva kysely alkaa toimia.
def vertaa_nocase(string1, string2):
if string1.lower() == string2.lower():
return 0
elif string1.lower() < string2.lower():
return 1
else:
return -1
#annetaan sqlitelle edellä luotu vertailufunktio
con.create_collation("vertaa_nocase", vertaa_nocase)
cur.execute("SELECT x FROM user WHERE etunimi = 'källe' COLLATE vertaa_nocase")
Ohje:
https://appro.mit.jyu.fi/ties4080/ohjaus/ohjaus3/#sqlitecase
--
Tommi Lahtonen, tommi.j.lahtonen(a)jyu.fi, < https://hazor.iki.fi/ >
If fifty million people say a foolish thing, it is still a foolish thing.