Closed nlinnanen closed 7 months ago
Moro
Kiitos hyvästä ja kattavasta palautteesta. Otinkin siitä useimmat esille nostetut kohdat käytäntöön ja implementoin ne koodiin, koska olin niistä samaa mieltä ja osa niistä ei ollutkaan tiedossa.
Requirements.txt tosiaan se parempi tapa ilmoittaa riippuvuudet
Flaskin sessioista olen ymmärtänyt ettei ne automaattisesti täytä csrf suojausta pelkällä käyttöönotolla ilman lisäosaa flask-wtf
ja sieltä ctrfprotect käyttöön. Tosin materiaalin perusteella en vielä täysin tajunnut miten csrf eroaa suojauksena kirjautumisen valvomisesta, koska mielestäni materiaalissa tallennettava csrf token kulkee myös cookien mukana. Ajattelin, että tämä toisaalta ei ole kaikista tärkein asia ja selkenee varmasti aikanaan, joten jätin csrf tokenin vielä kulkemaan POST formeissa mukana (liekö erona sitten se, että csrf token lähetetään vain silloin kun käyttäjä pyytää tietyn sivun minkä kautta voi lähettää tietoa)
before_request kohdan jätin vielä myöhemmälle katsannolle jos sen implementoisi myös mukaan. Saattaa tulla kyllä käyttöön
Sisäkkäiset if-lausekkeet oli hyvä huomio
Tietokannan DEFAULT asiaa en tiennytkään, joten tämä myös hyvä huomio
creator kohta viestissä oli tosiaan selkeä virhe ja on korjattu käyttämään ajantasaista Users -taulua
Nimeämiskäytännöt on tarkoituksellisia silloin kun ne menevät ristiin tiettyjen ohjeiden kanssa. Näistä juuri tietokannan taulujen nimeämiset isolla ja committien imperatiivisuuden sijaan imperfekti ilmaisu. Näistä itse käytetyt tyylit tuntuvat intuitiivisemmilta, mutta mikään ei tietenkään estä että itsellekin tulee myöhemmin erilainen käytäntö. Syynä on tosiaan vielä oma preferenssi
Yhden rivin if-lausekkeet tosiaan siistimpiä, joten nekin implementoitu missä pystyy ja näyttää järkevältä
Commititkin pilkottu pienemmiksi
Onnea omaan projektiisi myös!
Toimiva ja rakenteeltaan selkeä softa.
Toimivuus
Sovelluksen perusominaisuudet eli käyttäjän luonti, kirjautuminen, keskustelut ja profiilit toimivat hyvin. Sovellus on myös suojattu hyvin, eikä siihen ole löytynyt ilmeisiä haavoittuvuuksia. Sovellus on myös suhteellisen helppo käyttää ja navigoida. Skins ominaisuus ei taida vielä olla implementoitu. Lisäksi profiilien ja käyttäjien yhteys on hieman hämärä eikä sovelluksen tarkoitus ole tyäsin selvä ellei ole lukenut readmeta. Etusivulla voisi olla enemmän tietoa siitä, mitä sovellus tekee ja miten sitä käytetään.
Koodi
Koodi on pääosin selkeää ja helppolukuista. Koodi on myös jaettu selkeästi eri tiedostoihin ja funktioihin, mikä helpottaa ylläpitoa ja kehitystä. Koodi ei ole mitenkään erityisesti dokumentoitu, mutta se ei mielestäni ole tarpeellista, koska muuttujat ja funktiot on nimetty niin hyvin että koodi selittää itsensä. Alla muutamia huomioita koodista:
Readmessa voisi erillisten kirjastojen asentamisen siijaan ohjeistaa ajamaan vain
pip install -r requirements.txt
, näin varmistuisi että ladattavien kirjastojen versiot ovat oikeat.Sessioita käsitellään hieman oudolla tavalla. Flask kirjaston sessio assiosioidaan käyttäjään csrf tokenin avulla jonka kirjasto luo ja lähettää automaattisesti headereiden välityksellä. Kuitenkin koodissasi olet luonut uuden csrf tokenin, jota lähetetään formien mukana. Kannattaa luottaa kirjaston implementaatioon ja poistaa oma csrf tokeni. Tällöin tämän
Voisi korvata tällä:
koska username on asetettu vain jos käyttäjä on kirjautunut sisään. Lisäksi formeista voi poistaa piilotetut inputit joiden kautta lähetät csrf tokenin ja usernamen. Ne voi ottaa suoraan session dictistä. Kannattaa lukea uudestaan kurssimateriaalien osio kirjutumisesta, ja tarkastella miten se on siellä toteutettu.
Lisäksi jos haluaa vielä enemmän siistiä koodia, voi lisätä
before_request
funktioon tarkistuksen, joka tarkistaa onko käyttäjä kirjautunut sisään.:Tämä varmistaa, että käyttäjä on kirjautunut ladatessa mitä tahansa sivua, paitsi muuttujan
WHITELISTED_PATHS
polkuja.Monessa kohtaa koodia toistuu rakenne, missä on paljon sisäkkäisiä if lausekkeita joiden else haara on yksi rivi, jossa annetaan error ilmoitus. Tämä johtaa siihen, että koodi on todella sisennettyä ja täten vaikealukuista. Tätä voisi parantaa kääntämällä if lausekkeen negaatioksi ja poistamalla else haara kokonaan, koska koodi pysähtyy errorin kohdalla. Esim:
Voisi muuttaa muotoon:
Tämä tekee koodista helpommin luettavaa ja vähentää sisennystä.
Tietokanta
Tietokannan rakenne selkeä ja toimiva, eikä siinä vaikuta olevan paljon huomautettettavaa. Muutama huomio, jotka tekevät tietokannasta ehkä hieman käytettävämmän:
created
timestampit voisi ollaDEFAULT NOW()
jolloin niitä ei tarvitsisi muistaa asettaa erikseenmessages
taulussa on kentätcreator
jacreator_id
kentät.creator
pitää ilmeisesti sisällään käyttäjänimen, joka on jo tallennettuusers
tauluun. Tämä on hieman turhaa, koskacreator_id
kenttä riittää. Luojan käyttäjänimen hakeminen onnistuuJOIN
lausekkeella. Kaikkien viestien hakeminen on tietysti tehokkaampaa ja helpompaa nykyisellä rakenteella, mutta käyttäjänimen vaihtuessa joutuisi päivittämään kaikki viestit.Tyyliseikkoja
Tässä vielä muutama tyyliseikka, jotka ovat ehkä enemmän makuasioita kuin mitään kunnon palautetta.
Useassaa tiedostossa toistuu kaava:
Tämän voisi kirjoittaa vain ```return condition````
Commit messaget ovat selkeitä ja informatiivisia, mutta hyvien tapojen mukaan niiden pitäsi olla imperatiivisessa muodossa. Esim. "Added login page" -> "Add login page". Commitit ovat myös suurikokoisia, joten niitä voisi jakaa pienempiin osiin.