====== Konfiguracja Django ====== Na przykładzie Fedory (na CentOS jest tak samo) oraz MariaDB. Nazwę użytkownika w bazie danych najlepiej mieć taką samą, jak w /etc/passwd. ==== Baza danych ==== # sudo dnf install mariadb mariadb-server mariadb-devel python3-devel # sudo systemctl start mariadb # sudo mysql_secure_installation # mysql -u root -p > create user 'lukasz'@'localhost' identified by 'tajnehaslo'; > grant all privileges on *.* to 'lukasz'@'localhost' with grant option; > create user 'project'@'localhost' identified by 'tajnehaslo2'; > create database project; > grant all privileges on project.* to 'project'@'localhost'; > grant all privileges on test_project.* to 'project'@'localhost'; > exit; ==== Virtualenv oraz pip ==== # mkdir -p project/app # cd project # python3 -m venv . # source bin/activate # pip install --upgrade pip # pip install django mysqlclient # cd app # django-admin startproject project ==== settings.py ==== Poprawić konfigurację dla bazy danych. #DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } #} DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'project', 'USER': 'project', 'PASSWORD': 'tajnehaslo2', 'HOST': 'localhost', # Or an IP Address that your DB is hosted on 'PORT': '3306', } } ==== Uruchomienie testowej strony ==== # python manage.py runserver ---- ==== Django i replikacja w MariaDB ==== Przy założeniu, że mamy dwie bazy danych w klasycznym układzie: * primary - Rear/Write * replica - ReadOnly który został opisany na [[wiki:mariadb_replika|tej stronie]]. W katalogu z plikiem manage.py utworzyć plik dbroute.py o treści: import random from django.conf import settings class ReplicationRouter: def db_for_read(self, model, **hints): """ Randomly pick a database to read from """ return random.choice([key for key in settings.DATABASES]) def db_for_write(self, model, **hints): """ Always send write queries to the master database. """ return 'default'; def allow_relation(self, obj1, obj2, **hints): """ This isn't really applicable for this use-case. """ return True def allow_migrate(self, db, app_label, model_name=None, **hints): """ Only allow migration operations on the master database, just in case. """ if db == 'default': return True return None W pliku settings.py należy dodać linijkę DATABASE_ROUTERS = ['dbroute.ReplicationRouter'] oraz zmienić domyślny słownik DATABSES z Sqlite3 na Marię: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'nazwabazydanych', 'USER': 'uzytkownik', 'PASSWORD': 'haslo', 'HOST': 'maria1.ping.local', 'PORT': '3306' }, 'replica': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'nazwabazydanych', 'USER': 'uzytkownik', 'PASSWORD': 'haslo', 'HOST': 'maria2.ping.local', 'PORT': '3306' }, }