Selainpohjainen ohjelma Djangolla (h5)

Tämä blogipostaus on osa Haaga-Helian Linux Palvelimet -kurssia, jota Tero Karvinen pitää keväällä 2022.

Viidennen kurssiviikon tehtävät:

a) CRUD. Make a simple web program, that allows multiple users modify the same data. Have user accounts and logins. You can use Django development server and admin interface here. Single table is enough. We already did a Customer (CRM) database, so it might be interesting to do something as simple, but slightly different.

b) Prod. Make a production style Django install. Use Apache and mod_wsgi, disable DEBUG.”

(Karvinen 2022a)

a) Yksinkertainen ohjelma Djangolla testiympäristöön

Tavoitteena on tehdä yksinkertainen ohjelma, jossa useampi kuin yksi käyttäjä voi muokata tietoja yhtä aikaa, ja lisäksi ohjelman käyttäminen vaatii ensin sisään kirjautumisen. Tämä tehdään Djangolla testiympäristöön.

Olimme tehneet aiemmin tunnilla yksinkertaisen asiakkuudenhallintajärjestelmän (CRM), minkä vuoksi itsenäiseksi tehtäväksi piti keksiä jotain muuta. Päätin rakentaa järjestelmän, jossa voisi ylläpitää ja hallita verkkokaupan tuotteiden tietoja. Mikäli tätä tehtävää jatketaan myöhemmin monimutkaisemmaksi, sitä voisi tarvittaessa laajentaa verkkokaupan suuntaan, jolloin toki tarvittaisiin myös mm. asiakkuuksien, ostoskorien, rahaliikenteen ja verkkokauppatilausten logistiikan hallintaa.

Ensimmäiseksi asensin virtualenv-paketin ja loin testiympäristön, joka käyttää Pythonin versiota 3:

$ sudo apt-get -y install virtualenv
$ virtualenv –system-site-packages -p python3 env/

Jälkimmäinen komento loi env-nimisen kansion, jonne sijoitettiin Pythonin version 3 paketit. Tämän jälkeen otin testiympäristön käyttöön komennolla

$ source env/bin/activate

Kun testiympäristö oli aktivoitu ja käytössä, komentorivin alkuun tuli teksti ”(env)”. Niin kauan kuin ”(env)” on rivin alussa, tiedän operoivani testiympäristössä. Virtualenv ei kuitenkaan ole mikään tietoturvaominaisuus tai hiekkalaatikko, jossa voisi huoletta leikkiä, vaan asennettavat paketit täytyy harkita tarkkaan nyt, kun ne asennetaan Linuxin ulkopuolelta ilman apt-get -komentoa.

Varmistin vielä, että operoin todella testiympäristössä

$ which pip

jolloin sain vastaukseksi kansiorakenteen ”/home/susanna/env/bin/pip”. Pip-komennon kanssa ei saa koskaan käyttää super useria eli sudoa, eikä sitä kannata myöskään käyttää virtualenvin ulkopuolella.

Koska pip-komennolla saadun kansiorakenteen perusteella olin operoimassa oikeassa paikassa eli env-kansion alla, asensin seuraavaksi varmuuden vuoksi Micro-ohjelman ja lisäsin Python-paketin vaatimuksia sisältävään tekstitiedostoon:

$ sudo apt-get install micro
$ micro requirements.txt

Kirjoitin Microlla tekstitiedostoon ”django” ja näppäinyhdistelmällä Ctrl + S tallensin muutokset ja Ctrl + Q suljin tiedoston. Cat-komennolla tarkistin, että django-teksti oli tosiaan tallentunut tekstitiedostoon:

$ cat requirements.txt

Komennolla

$ pip install -r requirements.txt

asensin djangon testiympäristööni.

Lopuksi vielä tarkistin, että Djangosta oli tosiaan asentunut kaipaamani viimeisin versio 4.0.2.

Kun Djangon asennus oli valmis, ryhdyin pystyttämään Django-projektia eli tässä tapauksessa järjestelmää verkkokaupan tuotteiden ylläpitoon ja hallinnointiin. Projektin nimeksi annoin shop.

$ django-admin startproject shop

Kokeilin, saisinko shop-projektin testiympäristön näkymään Firefox-selaimen kautta. Menin shop-kansioon ja käynnistin testipalvelimen:

$ cd shop
$ ./manage.py runserver

Tämän jälkeen sain ilmoituksen, että testipalvelin on käynnissä  IP-osoitteessa http://127.0.0.1:8000/. Jos haluaisin sammuttaa testipalvelimen, se onnistuisi näppäinyhdistelmällä Ctrl + C. Avasin selaimessa annetun IP-osoitteen ja testipalvelin tosiaan toimi:

Siirryin selaimessa osoitteeseen http://127.0.0.1:8000/admin/, josta löytyi kirjautumissivu:

Ennen kuin voin yrittää kirjautumista täytyy järjestelmään luoda käyttäjä. Päivitin ensin tietokannat komennoilla

$ ./manage.py makemigrations
$ ./manage.py migrate

Sen jälkeen asensin koneelle pwgen-ohjelman, joka generoi salasanoja, ja generoin yhden 20-merkkisen salasanan:

$ sudo apt-get install pwgen
$ pwgen -s 20 1 # randomize a password

(Todellisuudessa generoin 20-merkkisen salasanan vielä toiseen kertaan, etten vedä mattoa jalkojeni alta paljastamalla pääkäyttäjäni salasanaa julkisesti Internetissä.)

Loin järjestelmään ensimmäisen uuden käyttäjän – tässä tapauksessa pääkäyttäjän – komennolla

./manage.py createsuperuser

Olisin voinut keksiä vaikeammin arvattavan käyttäjätunnuksen pääkäyttäjälle, mutta koska salasana on vahva ja kyse vain testiympäristöstä, se ei ole nyt niin vaarallista.

Tämän jälkeen yritin kirjautua sisään järjestelmään osoitteessa http://127.0.0.1:8000/admin/. Syötin äsken tekemäni superuserin tunnuksen ja salasanan kirjautumissivulle, jonka jälkeen pääsin sisään järjestelmään ja Djangon hallintasivu aukesi:

Loin hallintasivun kautta uuden käyttäjän (Users & Add), jolle annoin myös pääkäyttäjän oikeudet tietojen muokkaamiseen:

Klikattuani Save-painiketta sain ilmoituksen, että käyttäjä oli onnistuneesti luotu. Vieritin sivua alaspäin kohtaan ”Permissions”, jossa pääsin määrittelemään käyttäjän oikeuksia, ja tässä tapauksessa annoin uudelle käyttäjälleni sekä tavallisen käyttäjän että superuserin oikeudet, ja lopuksi tallensin muuttamani oikeusmäärittelyt:

Tämän jälkeen kirjauduin pääkäyttäjälläni ulos järjestelmästä, kirjauduin sisään uuden käyttäjän tunnuksilla ja kokeilin, pystynkö muokkaamaan järjestelmässä olevaa dataa. Testinä tein kolmannen käyttäjän, jolle annoin vain tavallisen käyttäjän oikeudet. Koska tämä uuden käyttäjän tekeminen onnistui, toinen käyttäjäni siis toimi. Niinpä pääsin siirtymään seuraavaan vaiheeseen ja luomaan tietokantaa verkkokaupan tuotteille.

Siirryin terminaalissa takaisin testiympäristöön (env) näppäinyhdistelmällä Ctrl + C. Loin sovelluksen nimeltä ”tuotteet” komennolla

$ ./manage.py startapp tuotteet

Tämä komento teki uuden kansion tuotteet/ verkkokaupan tuotteiden lisäämistä ja tuotetietojen ylläpitoa varten. Tämän jälkeen lisäsin sovelluksen ”tuotteet” projektin asetuksiin:

$ micro shop/settings.py

Etsin settings.py-tiedostosta kohdan INSTALLED_APPS, jonne lisäsin hakasulkeisiin listan jatkoksi ’tuotteet’.

Sitten lisäsin malleja muokkaamalla Microlla models.py-tiedostoa:

$ micro tuotteet/models.py

Kun nyt ajoin uudestaan komennot

$ ./manage.py makemigrations
$ ./manage.py migrate

Django loi tietokantaan models.py-tiedostossa määrittelemäni taulun ”Product”, johon kerätään verkkokaupan tuotteiden nimet, tuotenumerot, tuoteryhmät ja napakka kuvaus ominaisuuksista.

Sain useampaan kertaan tietokannan migraatiovaiheessa virheilmoituksen, jossa mainittiin models.py-tiedostoon kirjoittamani sana ”length”. Kun tutkin virheilmoitusta tarkemmin, huomasin joka kerta uuden virheilmoituksen huomauttavan siitä, että manuaalisesti kirjoittamassani koodissa oli kirjoitusvirhe ja length-sanasta oli jäänyt jokin konsonantti uupumaan tai mennyt kirjaimia sekaisin. Yllä olevan kuvan esimerkkitapauksessa vihje löytyi viimeiseltä riviltä, jossa kerrottiin koodissani olevan odottamaton argumentti ”max_lengt”: aiheellinen huomautus, sillä argumentin olisi pitänyt olla ”max_length”.

Jotta uusi tietokanta näkyisi hallintasivulla, se täytyi rekisteröidä tiedostossa admin.py:

$ micro tuotteet/admin.py

Tämän jälkeen käynnistin taas testipalvelimen komennolla

$ ./manage.py runserver

ja kirjauduin selaimessa hallintasivulle. Sivulle oli kuin olikin ilmestynyt uusi otsikko ”Tuotteet”, jonka alla oli äsken tehty taulu Products:

Yritin lisätä hallintasivun kautta (Products & Add) esimerkkituotteen verkkokaupan tuotevalikoimaan:

Jotain meni kuitenkin pieleen ja tuotetietojen tallentaminen sai aikaan vain virheilmoituksen:

Virheilmoituksen mukaan tietokannasta puuttuu taulu tuotteet_product, minkä takia tuotetietoja ei pystytty tallentamaan tietokantaan. Kävin vielä uudelleen läpi tekemäni vaiheet ja määritykset, mutta en löytänyt virheitä. Koska minulla oli kaksi sisäkkäistä shop-kansiota, veikkasin, että minulla oli mahdollisesti mennyt tuotteet-kansio väärän shop-kansion sisälle. Niinpä kopioin tuotteet-kansion sisältöineen shop-kansiosta kansioon shop/shop/ komennolla

$ cp -R Pictures Pictures_backup

(Linuxize 14.11.2020).

Tämän jälkeen tein tietokantamigraatiot uudelleen ja käynnistin testipalvelimen, syötin uudestaan esimerkkituotteen tiedot ja tallensin. Olin nähtävästi päätynyt virhetilanteen päättelyissäni oikeaan lopputulokseen, sillä tuotetietojen tallennus onnistui ja tuotteet-listaan ilmestyi ensimmäinen tuote:

Jotta tuotteen nimi olisi luettavampi ja kuvaavampi, lisäsin models.py-tiedostoon määrittelyn, että tuotelistassa näkyisi tuotteelle tuotetietoihin annettu nimi:

$ micro tuotteet/models.py

Tällä pienellä toimenpiteellä tuotelistan ensimmäinen tuote olikin jo helposti tunnistettavissa Texas Instrumentsin laskimeksi TI-86:

Näin olin saanut lopulta tehtävän vietyä loppuun asti. (Karvinen 2022b)

b) Selainpohjainen ohjelma tuotantoon

Tulossa.

Lähteet

Karvinen, T. 2022a. Linux Palvelimet 2022. Kurssisivusto. Luettavissa: https://terokarvinen.com/2021/linux-palvelimet-ict4tn021-3018/. Luettu: 1.3.2022.

Karvinen, T. 2022b. Django 4 Instant Customer Database Tutorial. Luettavissa: https://terokarvinen.com/2022/django-instant-crm-tutorial/. Luettu: 1.3.2022.

Karvinen, T. 2022c. Django on Apache – with Python 3 and Apache mod_wsgi on Ubuntu 16.04. Luettavissa: https://terokarvinen.com/2017/django-on-apache-with-python-3-on-ubuntu-16-04/. Luettu: 1.3.2022.

Linuxize. 14.11.2020. How to Copy Files and Directories in Linux. Luettavissa: https://linuxize.com/post/how-to-copy-files-and-directories-in-linux/. Luettu: 15.3.2022.

Artikkelia on päivitetty 15.3.2022: täydennetty tehtävää a).

1 ajatus aiheesta “Selainpohjainen ohjelma Djangolla (h5)”

  1. Paluuviite: Komentojen automatisointi ja skriptaus (h6) - Susanna Lehto

Kommentoi

Sähköpostiosoitettasi ei julkaista.