DevStack pro rychlý vývoj webů postavený na Debian 10 (buster)

DevStack se skládá z Python 3.9 (Python budu potřebovat pro web framework Django https://docs.djangoproject.com/en/3.1/topics/install/#install-python)…

Proč Django [džengou] ? Protože mám zkušenosti s PHP frameworkem Zend Framework 3 (později Laminas) a tam narážím na problémy, které nemají rychlé řešení a musí se hodně programovat něco, co už v jiných frameworcích dávno je. A to mě štvalo.

Komunita Python je obrovská. Najít řešení problémů na stackoverflow se mi podařilo zatím vždy. Python je skvěle designovaný jazyk. PHP je designováno pouze pro webové skripty a na backendu pokulhává čím dál více. Proč Python místo PHP si přečtěte např. na webu guru99.com. Na frameworku Django je postaven backend spousta úspěšných webů, např. sociální síťě instagram, Pinterest, hudební platforma Spotify. Z PHP na Django přešel i YouTube. Rychlé budování backendu a škálovatelnost je výhoda Django.

U jazyka pro tvorbu webu mě zajímá, jak je řešené routování, jak snadno jde vytvářet endpointy API, jak snadno jde buildit frontend (Typescript, Vue.js, Webpack, SCSS) a hlavně, jak dobře bude čitelný (upravitelný) kód. V PHP mi vyhovuje návrhové vzory MVC (Model-View-Controller) a celkově objektově orientované programování (tam, kde to je rychlejší než procedurální programování), v Pythonu se tomu říká MVT (Model-View-Template). Více k Difference between MVC and MVT design patterns. MVT jde dobře upravovat a používat i pro malé aplikace (MVC se pro malé projekty nehodí, ale když se z nich časem stánou velké projekty, tak přejít na MVC je obtížné). Raději tedy zvolím od začátku MVT, abych pak nemusel těžce refaktorovat.

Instalace alternativní verze Python 3.9.1 ze zdrojáků

1/ nejdříve aktualizovat systém a doinstalovat potřebné knihovny na kompilaci zdrojového kódu Python, potvrdit Yes

sudo apt update & sudo apt upgrade

sudo apt install wget build-essential libreadline-gplv2-dev libncursesw5-dev \

libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev libffi-dev zlib1g-dev

2/ alternativní instalace ze zdrojových kodů (v tomto případě 3.9.1), aktuální verzi najdete na https://www.python.org/downloads/

wget https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz

tar xzf Python-3.9.1.tgz

cd Python-3.9.1/

./configure –enable-optimizations

make -j 2

sudo make altinstall

Poznámka: Nikdy nepoužívat make install, protože by to přepsalo binárky pythonu 3. Bude to jen alternativní verze.

3/ test úspěšné instalace Python 3.9

python3.9 –version

Python 3.9.1

which python3.9

/usr/local/bin/python3.9

Pokud budu později potřebovat nastavit Python3.9 jako výchozí pro příkaz python, tak přidám alternativu takto:

update-alternatives –install /usr/bin/python python3 /usr/local/bin/python3.9 10

Prohlídnout si konfiguraci alternativ pro python3 se dá takto:

update-alternatives –config python3


Ve skupině odkazů python3 (poskytující /usr/bin/python) je jen jedna alternativa: /usr/local/bin/python3.9

python -V

Python 3.9.1

Instalace oficiální release modulu Django do Python 3.9

Nejdříve aktualizovat modul pip (aktuální verze v době instalace 21.0.1)

python3.9 -m pip install –upgrade pip

python3.9 -m pip install Django

Aktuální verze v době instalace je Django-3.1.7.

Alternativou pro oficiální release je instalace development verze případně distribuční verze.

Instalace vývojářského IDE pro Python

Tady je velký výběr. Já zvolil free produkt PyCharm Community od JetBrains (používám již několik let placenou verzi PhpStorm od stejné firmy). Pro začátky stačí, i když nemá podporu CSS, SCSS, JS, VUE.JS atd. Placená verze by to měla umět. Doporučuji PyCharm instalovat přes JetBrains Toolbox, usnadní to aktualizace.

Vytvoření prvního webového projektu

Postupovat podle návodu k Django frameworku https://docs.djangoproject.com/en/3.1/intro/tutorial01/

V terminálu spustit příkaz:

django-admin startproject mysite

mysite bude název adresáře (lze použít cokoliv kromě názvu django, aby se to nepletlo), spustit např. ve složce ~/PycharmProjects$ django-admin startproject mysite

Vytvoří adresář se soubory:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        asgi.py
        wsgi.py

Spuštění projektu:

~/PycharmProjects/mysite$ python3.9 manage.py runserver

Starting development server at http://127.0.0.1:8000/

Lokální webserver běží, možné zkontrolovat v prohlížeči na uvedené adrese. V dalším kroku řeším, jak rozběhnout produkční webserver.

Deploy webu na produkční webserver přes GitLab

Nejdříve vytvořit GIT repozitář, který pak bude možné automaticky doručovat na server přes GitLab server. V menu kliknout na VCS -> Create Git Repository, přidat do něho všechny soubory v adresáři mysite , komitnout změny, vybrat remote a pushnout soubory na server. Bez PyCharm jde o příkazy git init, git add, git commit, git push s parametry… to tady nebudu řešit, PyCharm IDE to řeší za mně.

V dalším kroku přidám soubory .gitlab-ci.yml (konfigurace CI/CD…používám rsync), .gitignore (seznam adresářů a souborů, které nechci mít v git repozitáři, např. adresář .idea).

Produkční webserver potřebuje také nainstalovat Python. Např. pro CentOS 7 je postup instalace zde: https://computingforgeeks.com/install-latest-python-on-centos-linux/

Konfigurace virtuálního prostředí

Samotný deployment zde zveřejnovat nebudu, každý používá svůj postup, např. rsync.

Do projektu přidat virtuální prostředí přes Setting – Python intepreter.

Závislosti projektu řešit přes Virtualenv a pro tento účel je třeba vytvořit soubor requirements.txt.

Úprava na produkčním webserveru CentOS 7:

python3.9 -m pip install pip –upgrade

Successfully installed pip-21.0.1

python3.9 -m pip install virtualenv

Successfully installed appdirs-1.4.4 distlib-0.3.1 filelock-3.0.12 six-1.15.0 virtualenv-20.4.2

yum install sqlite

Aktualizováno:
sqlite.x86_64 0:3.7.17-8.el7_7.1

Můj webserver má oficiální distribuci sqlite 3.7.17, což stačí ve výchozím nastavení Django jen na verzi 2.

Zdroj: https://docs.djangoproject.com/en/3.1/faq/install/

CI/CD pipeline může vypadat např. takto:

A výsledek.

Abych mohl používat nejnovější verzi Django frameworku, použiju místo databáze SQLite MariaDB.

Django: změna výchozí databáze SQLite na MariaDB (MySQL)

V souboru mysite/settings.py upravit v DATABASES nastavení pro default. Django má vestavěné databázové ovladače pro:

  • 'django.db.backends.postgresql'
  • 'django.db.backends.mysql'
  • 'django.db.backends.sqlite3'
  • 'django.db.backends.oracle'
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'DB_NAME',
        'USER': 'DB_USER',
        'PASSWORD': 'DB_PASSWORD',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}

sudo apt-get install -y python3-mysqldb

Nutné změny v souboru settings.py.

import pymysql
pymysql.install_as_MySQLdb()

A přidání řádku

PyMySQL

do requirements.txt

Lokální webserver mi zahlásí, že mám spustit příkaz migrate, protože se v setting.py změnilo nastavení na MariaDB.

python3.9 manage.py migrate

Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions

A výsledek je běžící nejnovější Django 3.1 na produčním webserveru.

Jak přidat JS, CSS, fotky a další statické soubory (django.contrib.staticfiles)

Django používá (ve výchozím nastavení) na statické soubory aplikaci django.contrib.staticfiles. Ujistěte se, že máte v setting.py tuto aplikaci přidanou. Mělo by to vypadat takto.

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]

Dokumentace ke statickým souborům je výborná, ostatně jako dokumentace ostatních komponent Django…(když to srovnám s dokumentací PHP frameworku Zend Framework 3, tak je to balzám na duši).

Přidám do settings.py STATIC_ROOT.

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/

STATIC_URL = '/static/'
STATIC_ROOT = "/home/petr/PycharmProjects/mysite/static/"

python manage.py collectstatic

132 static files copied to ‚/home/petr/PycharmProjects/mysite/static‘.

Přidat do gitu a pushnout na server.

Jak přidat administraci (django.contrib.admin)

Jedna z nejsilnějších částí frameworku Django je automatické rozhraní pro administraci. Ve výchozím nastavení je zapnutá.