====== 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'
},
}