Hello Django

Cool framework

Hello Django

Django

Django is a high-level Python web framework that encourages rapid development and clean, pragmatic design. Built by experienced developers, it takes care of much of the hassle of web development, so you can focus on writing your app without needing to reinvent the wheel. It’s free and open source.” - Django [1]

Django is a free and open-source, Python-based web framework that runs on a web server. It follows the model–template–views architectural pattern. It is maintained by the Django Software Foundation, an independent organization established in the US as a 501 non-profit.” - Wikipedia [2]

Avoimeen lähteeseen perustuva Django on web-kehys joka toimii Pythonilla. Django on helppo käyttää ja ottaa käyttöön, ja Django tarjoaa kaiken mahdollisen tarvittavan ohjelmiston tai web-sovelluksen kehitykseen. [3]

PostgreSQL

PostgreSQL (pgsql) on SQL-kieltä tukeva avoimen lähdekoodin tietokantamoottori.” - Linux.fi-wiki [4]

Laitteisto

Tehtävät

a) Tee yksinkertainen esimerkkiohjelma Djangolla.

Aloitin tehtävän la 28.9 klo 11:25

Minulla oli tehtävää varten valmiina virtuaalinen palvelin.

Tein alkutoimet.

Seurasin opettajan ohjeita: Django 4 Instant Customer Database Tutorial. [5]

Asensin virtuaaliympäristön palvelintietokoneelle:

sudo apt-get -y install virtualenv

Tein uuden ympäristön Djangoa varten:

virtualenv --system-site-packages -p python3 env/

Näyttökuva 2024-9-28 kello 11 53 09

Nyt minulla oli uusi kansio env/, jossa tarvittavat paketit. Otin uuden ympäristön käyttöön komennolla:

source env/bin/activate

Käyttäjätunnukseni edessä lukee (env), käytän eri ympäristöä.

Näyttökuva 2024-9-28 kello 11 56 58

which pip
/home/leonardo/env/bin/pip

Minulla oli jo Micro editori, versio 2.0.11

Tein microdokumentti requirements.txt, kirjoitin django, ja tallensin sen virtuaaliympäristöön

Sen jälkeen komento:

pip install -r requirements.txt

Sain ladattua djangon

Näyttökuva 2024-9-28 kello 12 11 13

Näyttökuva 2024-9-28 kello 12 18 30

Näyttökuva 2024-9-28 kello 12 26 55

Tietokanta

Näyttökuva 2024-9-28 kello 12 27 57

Näyttökuva 2024-9-28 kello 12 25 58

micro crm/models.py

Lisäsin models.py esimerkkikoodia opettajan esimerkistä:

from django.db import models

class Customer(models.Model):
    name = models.CharField(max_length=160)

    def __str__(self):		
        return self.name	

Lähde terokarvinen.com. [6]

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

Näyttökuva 2024-9-28 kello 12 41 03

Rekisteröin tietokannan:

micro crm/admin.py

ja lisäsin tiedostoon seuraavan pätkän:

admin.site.register(models.Customer)

Lähde terokarvinen.com. [6]

Olin lukenut opettajan ohjeet loppuun, tässä vaiheessa halusin kokeilla mitä sain aikaiseksi.

Käytin komentoa:

./manage.py runserver

Sain virheviestin

Näyttökuva 2024-9-28 kello 12 51 07

    admin.site.register(models.Customer)
                    ^^^^^^
    NameError: name 'models' is not defined

Koodipätkä on tiedostossa crm/admin.py. Koodista puuttui from . import models. Lisäsin sen

from django.contrib import admin
from . import models

admin.site.register(models.Customer)

Tarkistin uudelleen:

./manage.py runserver

Sain tulokseksi:

Näyttökuva 2024-9-28 kello 13 02 21

Tässä vaiheessa en ollut varma että toimiiko Django niinkuin pitäisi.

curl -s localhost|grep title # access without GUI

Sain osoitteen http://127.0.0.1:8000/ josta olisin voin tarkistaa selaimella, mutta käytän Djangoa palvelimen kautta. Curl komennolla pitäisi näkyä että näkyykö sivu, mutta saan virheviestin:

curl: (7) Failed to connect to 127.0.0.1 port 8000 after 0 ms: Couldn't connect to server

Klo 13:05 otan taukoa, ja palaan myöhemmin kokeilemaan eri keinoja, joilla saisin Django käynnistymään oikein.

Klo 15:55 aloitin uudelleen.

Päätin yrittää Djangon käynnistystä paikallisesti, Raspberry Pi -tietokoneella.

Aloitin käymällä läpi seuraavat sivut

Seurasin opettajan ohjeita uudelleen. Käynnistys näytti onnistuvan.

./manage.py runserver

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
September 27, 2024 - 17:29:11
Django version 5.1.1, using settings 'folder.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Selaimessa kuitenkin:

Näyttökuva _1

Lopetin 28.9 17:35

Tulin illemmalla takaisin, kokeilin vielä kerran Djangon käyttöönottoa onnistumatta.

Päätin aloittaa tyhjältä pöydältä.

Poistin Djangon, sille luomani ympäristön ja Apachen. Epäilin että Apachella olisi vaikutusta. # https://stackoverflow.com/questions/30670759/run-django-without-apache-using-runserver-on-port-80-and-accessible-outside-lan

Sitten kokeilin uudestaan, seuraamalla opettajan ohjeita.

Näyttökuva

Näyttökuva 2

Näyttökuva 3

29.9 klo 0:11 Djangon raketti näkyi selaimella.

CRM

Näyttökuva 4

Tässä välissä tein käyttäjän leonardo

Näyttökuva 5

Lisäsin settings.py tiedostoon rivin 'crm'

models.py tiedostoon lisäsin python koodin:

from django.db import models

class Customer(models.Model):
    name = models.CharField(max_length=160)

    def __str__(self):		# new
        return self.name	# new

admin.py tiedostoon:

from django.contrib import admin
from . import models

admin.site.register(models.Customer)

Yritin käynnistää Djangon, mutta sain virheviestin Error: that port is already in use

Hain tietoa Googlesta, ja löysin ohjeen miten sulkea käynnissä olevat portit.

A more simple solution just type sudo fuser -k 8000/tcp. This should kill all the processes associated with port 8000.

EDIT:

For osx users you can use sudo lsof -t -i tcp:8000 xargs kill -9

edited Nov 17, 2015 at 12:49 answered Nov 27, 2013 at 10:53

Stackoverflow.com, Mounir

[7] [8]

Kokeilin mitkä portit ovat estämässä. Vahingossa suljin selaimen, mutta samalla varmistuin että syntaksi toimii:

Näyttökuva 6

Näyttökuva 7

Näyttökuva 8

Näyttökuva 10

CRM toimii. Selailin Djangoa ja lisäsin uuden käyttäjän.

b) Tee Djangon tuotantotyyppinen asennus

Aloitin klo 29.9 22.24. Seuraan opettajan ohjeita

Päivitin koneen ja käynnistän Apachen.

sudo apt-get update
sudo systemctl start apache2

Tein uuden kansion:

mkdir -p publicwsgi//tuotantoDjango/static/

Valmistelin .html tiedoston:

echo "Statically see you at llanga.live."|tee publicwsgi/tuotantoDjango/static/index.html

Lisäsin konfiguraatioasetuksiin polun

Alias /static /home/uhse/publicwsgi/tuotantoDjango/static/
<Directory /home/uhse/publicwsgi/tuotantoDjango/static/>
    Require all granted
</Directory>

Sivuasetukset:

sudo a2dissite 000-default.conf 
sudo a2ensite llanga.live.conf

Näyttökuva 2024-9-29 kello 23 14 09

Näyttökuva 2024-9-29 kello 23 14 53

Django virtuaaliympäristön asennus

echo "Statically see you at llanga.live."|tee publicwsgi/tuotantoDjango/static/index.html
cd publicwsgi/
virtualenv -p python3 --system-site-packages env
source env/bin/activate

Pääsin virtuaaliympäristöön, josta pääsin asentamaan Djangon.

pip install -r requirements.txt

Successfully installed django-4.2.16

Sitten aloitin Django projektin:

django-admin startproject tuotantoDjango
micro /etc/apache2/sites-available/llanga.live.conf

Muokkasin opettajan esimerkkiä ja vaihdoin kansion nimen, sekä polun:

Define TDIR /home/uhse/publicwsgi/tuotantoDjango
Define TWSGI /home/uhse/publicwsgi/tuotantoDjango/wsgi.py
Define TUSER uhse
Define TVENV /home/uhse/publicwsgi/env/lib/python3.9/site-packages


<VirtualHost *:80>
    Alias /static/ ${TDIR}/static/
    <Directory ${TDIR}/static/>
            Require all granted
    </Directory>

    WSGIDaemonProcess ${TUSER} user=${TUSER} group=${TUSER} threads=5 python-path="${TDIR}:${TVENV}"
    WSGIScriptAlias / ${TWSGI}
    <Directory ${TDIR}>
         WSGIProcessGroup ${TUSER}
         WSGIApplicationGroup %{GLOBAL}
         WSGIScriptReloading On
         <Files wsgi.py>
            Require all granted
         </Files>
    </Directory>

</VirtualHost>

Undefine TDIR
Undefine TWSGI
Undefine TUSER
Undefine TVENV

Apachen moduuli virtuaaliympäristössä:

sudo apt-get -y install libapache2-mod-wsgi-py3
/sbin/apache2ctl configtest

Näyttökuva 2024-9-29 kello 23 39 58

sudo systemctl restart apache2
curl -s localhost|grep title

Virhe:

<title>404 Not Found</title>

Tarkistin lokista:

sudo tail -f /var/log/apache2/error.log

Loki:

Mon Sep 30 00:10:04.536650 2024] [wsgi:error] [pid 4838:tid 4847] [client ::1:59554] Target WSGI script not found or unable to stat: /home/uhse/publicwsgi/tuotantoDjango/wsgi.py
[Mon Sep 30 00:12:11.162752 2024] [wsgi:error] [pid 4838:tid 4852] [client 127.0.0.1:44910] Target WSGI script not found or unable to stat: /home/uhse/publicwsgi/tuotantoDjango/wsgi.py

Tarkemmin:

Target WSGI script not found or unable to stat: /home/uhse/publicwsgi/tuotantoDjango/wsgi.py

Eli Django ei päässyt käsiksi wsgi.py tiedostoon. Tarkistin missä tiedosto on -> /home/uhse/publicwsgi/tuotantoDjango/tuotantoDjango/wsgi.py.

Ajoin django-admin startproject komennon tuotantoDjango kansion sisällä, joka loi uuden samannimisen kansion , jossa kyseinen tiedosto oli.

Kävin vaihtamassa .conf tiedostossa poluksi /home/uhse/publicwsgi/tuotantoDjango/tuotantoDjango/wsgi.py.

Näyttökuva 2024-9-30 kello 0 29 48

Näyttökuva 2024-9-30 kello 0 31 53

Django käynnistyi.

Debug ottaminen pois käytöstä. Näin rikolliset tai muut eivät pääse näkemään tarkasti virheviestejä.

micro tuotantoDjango/settings.py

Vaihdoin ALLOWED_HOSTS muuttujan True:ksi

ALLOWED_HOSTS = ["localhost", "llanga.live"]

Sekä lisäsin:

import os

ja:

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

Sen jälkeen:

touch tuotantoDjango/wsgi.py
sudo systemctl restart apache2

Näyttökuva 2024-9-30 kello 0 38 59

Näyttökuva 2024-9-30 kello 0 59 08

Tein uuden käyttäjän leonardo, jotta pääsen käyttämään Djangoa.

Näyttökuva 2024-9-30 kello 1 01 01

Klo 01:00 tuotantotyyppinen Django oli valmis

Näyttökuva 2024-9-30 kello 1 03 14

PostgreSQL

Tehtävä osoittautui hankalaksi, ja kokeilin CHATGPT.

Prompt:

PostgreSQL käyttöönotto Djangossa (env) ympäristössä

Vastauksena sain ohjeet:

Asenna psycopg2-kirjasto, joka mahdollistaa Djangon yhteyden PostgreSQL:ään:

pip install psycopg2

Avaa projektisi settings.py-tiedosto ja muuta tietokantakonfiguraatiota PostgreSQL:ksi :

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'your_db_name',
        'USER': 'your_db_user',
        'PASSWORD': 'your_db_password',
        'HOST': 'localhost',  # tai '127.0.0.1'
        'PORT': '5432',       # Oletusportti
    }
}

Siirry PostgreSQL komentoikkunaan:

sudo -u postgres psql

Luo uusi tietokanta:

CREATE DATABASE your_db_name;
CREATE USER your_db_user WITH PASSWORD 'your_db_password';
ALTER ROLE your_db_user SET client_encoding TO 'utf8';
ALTER ROLE your_db_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE your_db_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE your_db_name TO your_db_user;

Poistu PostgreSQL-komentoriviltä:

\q

Luo malleja models.py-tiedostoon ja suorita migraatiot:

# myapp/models.py
from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    value = models.IntegerField()

Suorita seuraavat komennot:

python manage.py makemigrations
python manage.py migrate

Avaa Python shell Djangossa ja testaa tietojen tallentamista:

python manage.py shell

from myapp.models import MyModel

# Luo uusi objekti
obj = MyModel(name='Test', value=123)
obj.save()  # Tallenna tietokantaan

Voit tarkistaa tiedot PostgreSQL komentoikkunasta:

sudo -u postgres psql your_db_name
SELECT * FROM myapp_mymodel;  -- Varmista, että objekti tallentui

————-CHATGPT vastaus loppuu ———–¢

Kokeilin ChatGPT vastauksia, se näytti jotenkin järkevältä mutta ei toiminut.


Näyttökuva 2024-9-30 kello 2 13 52

settings.py

Näyttökuva 2024-9-30 kello 2 03 04

./manage.py migrate

Näyttökuva 2024-9-30 kello 2 39 42

Huomasin että PostgreSQL sisällä komentojen käyttö oli vaikeata, sain usein syntaksivirheitä. Epäonnistuin luomaan käyttäjän oikealla tavalla, josta tuli myöhemmin virheitä kun yritin ajaa komennon ./manage.py migrate. Esim.

    psycopg2. OperationalError: FATAL: password authentication dailed for user "leonardo" 
    FATAL: password authentication failed for user "leonardo"

[9] [10]

Näin että ongelma oli salasanassa, mutta muuten PostgreSQL pitäisi toimia. Yritän kokeilla myöhemmin uudelleen.

Lopetin klo 30.9 02:40

PÄIVITYS 2.10.2024 klo 16:50

Yritin saada PostgreSQL-tietokannan toimimaan Djangossa, ennen tuntia. En ymmärtänyt missä vika oli, vaihdoin settings.py-tiedostossa salasanan, olin jo kokeillut ilman salasanaa sekä salasanalla, jota varmasti käytin luodessani käyttäjän.

Ei onnistunut, sain edelleen saman virheviestin:

django.db.utils.OperationalError: FATAL:  password authentication failed for user "leonardo"
FATAL:  password authentication failed for user "leonardo"

Kirjoitin saman virheviestin googleen, poistin oman käyttäjänimen ja kansionimen. Löysin StackOverFlow:sta vastaavan kysymyksen. Ensimmäinen vastaaja ehdotti salasanan vaihtamista PostgreSQL:ssä, kokeilin sitä ensin myös:

Näyttökuva 2024-10-2 kello 17 24 24

[11]

Suljin tietokannan, ja kokeilin ./manage.py makemigrations uudelleen, ja sain saman virhekoodin. Tämä ei kuitenkaan toiminut, sillä syntaksini oli väärä.

Tietokantojen komennoissa, oikeinkirjoitus ja ; merkki ovat tärkeitä.

SQL- harjoituksista oli jo vähän aikaa, ja ennenkuin tajusin edes virhettä. Päätin poistaa käyttäjän.

Mieleeni tuli poistaa kyseinen käyttäjä, ja luoda uusi. Näin voisin ainakin saada tietokannan toimimaan.

Etsin tietoa googlesta hakemalla:

Google: how to delete users in postgres

Löysin PosgreSQL: sivuilta dropuser komennon, mutta ihmettelin syntaksia, komennot olivat kirjoitettu pienellä. [12]

Avasin uudelleen tietokannan ja yritin poistaa käyttäjän leonardo:

Näyttökuva 2024-10-2 kello 17 29 03

Ensin oli syntaksivirheitä, sain ne korjattua.

Toiseksi, en voinut poistaa käyttäjää koska siihen oli sidottu koko tietokanta.

Samasta kysymysketjusta löysin

What worked for me on AWS RDS (PostgreSQL 13) is the following:

REVOKE ALL PRIVILEGES ON DATABASE <my_db> FROM <my_user>;

I also had a similar error where the role was owner for tables so it couldn't be dropped, had to re-assign table owner with:

ALTER TABLE <my_table> OWNER TO <trusted_role>;

In fact, on RDS, AWS doesn't give you full superuser to your master user, so the following REASSIGN command fails:

REASSIGN OWNED BY <olduser> TO <newuser>;

edited May 6 at 11:34
Eddie C.'s user avatar
Eddie C.
9961010 silver badges1818 bronze badges
answered Sep 16, 2021 at 19:48
Andrew's user avatar
Andrew

Peruin leonardo-käyttäjän oikeudet, jonka jälkeen järjestelmä suostui poistamaan käyttäjän. Tarkistin vielä käyttäjän komennolla \du

Käyttäjä oli poistunut onnistuneesti. Nyt voisin kokeilla uudestaan tietokannan käyttöönottoa.

Päätin jatkaa myöhemmin, koska tunti oli alkanut jo.

Tunnin aikana tein seuraavan:

Tein käyttäjän uudelleen, käytin samaa käyttäjänimeä ja salasanaa, joten settings.py-tiedostoa ei tarvinnut muokkaa.

Näyttökuva 2024-10-2 kello 19 12 02

Tällä kertaa Django käynnistyi OK, mutta sain virhekoodin [02/Oct/2024 16:09:09] "GET / HTTP/1.1" 400 143 kun yritin avata selaimella.

Näyttökuva 2024-10-2 kello 19 17 04

PostgreSql päivitetty

Päivitys 11.10.2024

Kokeilin tehtävää uudellee, tällä kertaa Debian 12 käyttöjärjestelmällä, Intel Macbookin kanssa.

Olin myös perehtynyt paremmin PostgreSql kantaan ja sen komentoihin.

Seurasin uudestaan opettajan ohjeita. terokarvinen.com

Tein leovice käyttäjästä superuserin, sillä olisi pitänyt pystyä tekemään tietokanta, mutta sain virheen aina kun yritin luoda taulua.

Näyttökuva 2024-10-11 kello 10 32 41

Lopulta kirjauduin suoraan Superuser:na, ja pääsin heti ja helposti muokkaamaan tietokantaa.

Näyttökuva 2024-10-11 kello 10 20 34

Tietokannassa näkyi juuri lisätyt aiheet.

Näyttökuva 2024-10-11 kello 10 30 12

  1. https://www.djangoproject.com/
  2. https://en.wikipedia.org/wiki/Django_(web_framework)
  3. https://www.tieturi.fi/koulutusala/ohjelmistokehitys/ohjelmoinnin-viitekehykset
  4. https://www.linux.fi/wiki/PostgreSQL
  5. https://terokarvinen.com/2022/django-instant-crm-tutorial/?fromSearch=django
  6. https://terokarvinen.com/2022/django-instant-crm-tutorial/
  7. https://stackoverflow.com/questions/20239232/django-server-error-port-is-already-in-use
  8. https://man7.org/linux/man-pages/man2/kill.2.html
  9. https://pimylifeup.com/raspberry-pi-postgresql/
  10. https://www.postgresql.org/docs/current/user-manag.html
  11. https://stackoverflow.com/questions/43060857/postgresql-fatal-password-authentication-failed-for-user-douglas
  12. https://www.postgresql.org/docs/current/app-dropuser.html