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.
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á.