Commit 6a6bb168 authored by Claude Paroz's avatar Claude Paroz
Browse files

Delayed settings.DATABASE_ROUTERS usage by ConnectionRouter

Refs #20474.
parent 2d8c132b
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
import warnings

from django.conf import settings
from django.core import signals
from django.db.utils import (DEFAULT_DB_ALIAS,
    DataError, OperationalError, IntegrityError, InternalError,
@@ -14,7 +13,7 @@ __all__ = ('backend', 'connection', 'connections', 'router', 'DatabaseError',

connections = ConnectionHandler()

router = ConnectionRouter(settings.DATABASE_ROUTERS)
router = ConnectionRouter()

# `connection`, `DatabaseError` and `IntegrityError` are convenient aliases
# for backend bits.
+13 −4
Original line number Diff line number Diff line
@@ -214,14 +214,23 @@ class ConnectionHandler(object):


class ConnectionRouter(object):
    def __init__(self, routers):
        self.routers = []
        for r in routers:
    def __init__(self, routers=None):
        """
        If routers is not specified, will default to settings.DATABASE_ROUTERS.
        """
        self._routers = routers

    @cached_property
    def routers(self):
        if self._routers is None:
            self._routers = settings.DATABASE_ROUTERS
        for r in self._routers:
            if isinstance(r, six.string_types):
                router = import_by_path(r)()
            else:
                router = r
            self.routers.append(router)
            self._routers.append(router)
        return self._routers

    def _router_func(action):
        def _route_db(self, model, **hints):