Мультибазы данных в 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. А я не хочу направлять пользователя в базу данных из представления. Пожалуйста, посоветуйте, как достичь моей цели или как заставить этот подход работать