Мультибазы данных в django

Я реализую мульти-базу данных в django и хочу направить использование к определенной базе данных на основе страны в заголовке запроса пользователя 'X-Country'. Вот мое пользовательское промежуточное ПО

class CountryMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        country = request.headers.get('X-Country', None)
        request.country = country
        print("Country Middleware - Country:", country)
        return self.get_response(request)

И мой пользовательский маршрутизатор


from django.conf import Settings


class CountryBasedRouter:
    def __init__(self):
        self.country_database_mapping = {
            'databaseng': ['NG', 'GH'],
            'databaseothers': ['US'],
        }

    def db_for_read(self, model, **hints):
        print("urequestrequestrequestrequestdua", hints.get('request'))
        return self.get_database_for_country(**hints)

    def db_for_write(self, model, **hints):
        return self.get_database_for_country(**hints)

    def allow_relation(self, obj1, obj2, **hints):
        return getattr(obj1, 'country', None) == getattr(obj2, 'country', None)

    def get_database_for_country(self, **hints):
        request = hints.get('request', None)

        if not request or not hasattr(request, 'country'):
            raise ValueError("Country information not found in the request.")

        # Prioritize 'X-Country' header over the 'country' attribute in case both are present
        country = request.headers.get('X-Country', request.country)

        for db, countries in self.country_database_mapping.items():
            if country in countries:
                return db

        raise ValueError(f"No matching database found for country: {country}")

И некоторые выдержки из моего файла settings.py

DATABASE_ROUTERS = ['routers.db_router.CountryBasedRouter']
DATABASES = {
    'default': {},
    'databaseng': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'host',
        'PORT': 5432,
    },
    'databaseothers': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'name',
        'USER': 'user',
        'PASSWORD': 'password',
        'HOST': 'host',
        'PORT': 5432,
    }
}

В процессе отладки я обнаружил, что не могу получить доступ к объекту запроса из **hint. А я не хочу направлять пользователя в базу данных из представления. Пожалуйста, посоветуйте, как достичь моей цели или как заставить этот подход работать

В процессе отладки я обнаружил, что не могу получить доступ к объекту запроса из **hint. А я не хочу направлять пользователя в базу данных из представления. Пожалуйста, посоветуйте, как достичь моей цели или как заставить этот подход работать

Вернуться на верх