DoggieMurr
@DoggieMurr
Python Enthusiast

Как применять разные настройки Django в зависимости откуда был запрос?

Есть облачный сервер на котором есть 3 домена:
1. www.prod.com (где крутиться продакшн фронта)
2. www.test.com (где крутиться тестовый фронт)
3. www.backend.com (где крутиться бэкенд для этих двух фронтов)

Как с помощью джанго на бэке вычислять из какого домена был послан запрос и в зависимости от ответа применять те или иные настройки?
  • Вопрос задан
  • 77 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Everything_is_bad
проще разделить бэкенд на два инстанса, для прода и и для тестов.
Ответ написан
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
Как с помощью джанго на бэке вычислять из какого домена был послан запрос и в зависимости от ответа применять те или иные настройки?

Как вариант, можно создать новый класс в middleware с проверкой источника запроса и использованием другого конфига по условию. В wsgi.py (если используется wsgi) пишем примерно так:
class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        d = request.get_host().split(':')[0]

        if d == 'www.prod.com':
            settings = importlib.import_module('project.config_prod')
        elif d == 'www.test.com':
            settings = importlib.import_module('project.config_test')
        else:
            settings = importlib.import_module('project.config')

        request.settings = settings

        response = self.get_response(request)
        return response

Django не рекомендует изменять настройки в рантайме (после запуска Django), так как это может привести к нестабильной работе и непредсказуемым результатам, особенно в многопоточной среде. А так же, импортирование разных настроек внутри middleware не обязательно повлияет на уже инициализированные компоненты Django, такие как модели, представления и т.д., так как большинство настроек читается Django один раз при запуске.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы