Narzędzia użytkownika

Narzędzia witryny


wiki:django_setup

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
# 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 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'
    },
}
wiki/django_setup.txt · ostatnio zmienione: 2022/08/18 11:44 przez 127.0.0.1

Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki