sergey_1990
@sergey_1990
1

Как отменить подстановку языка из HTTP_ACCEPT_LANGUAGE в django 4.2?

Добрый день! Столкнулся с такой историей, есть мультиязычный сайт, и потребовалось подключение from django.contrib.gis.geoip2 import GeoIP2, как написано в документации
Changed in Django 4.2:
Support for .mmdb files downloaded from DB-IP was added.
, ну так и поступил, обновил версию Джанги с 4.1.6. на 4.2, всю эту беду запустил, НО тут пришла беда откуда не ждали, начала тупить мультиязычность, то-есть начал автоматически подставлять /ru/ в маршрут, хотя
LANGUAGE_CODE = "en"
prefix_default_language=False,
, начал ковыряться в чём причина, думал доб модули меняют что то, но оказалось дело в джанге, они убрали строчки из env/lib/python3.10/site-packages/django/middleware/locale.py было :
def process_request(self, request):
        urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
        (
            i18n_patterns_used,
            prefixed_default_language,
        ) = is_language_prefix_patterns_used(urlconf)
        language = translation.get_language_from_request(
            request, check_path=i18n_patterns_used
        )
        language_from_path = translation.get_language_from_path(request.path_info)
        if (
            not language_from_path
            and i18n_patterns_used
            and not prefixed_default_language
        ):
            language = settings.LANGUAGE_CODE
        translation.activate(language)
        request.LANGUAGE_CODE = translation.get_language()

стало
def process_request(self, request):
        urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF)
        i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf)
        language = translation.get_language_from_request(request, check_path=i18n_patterns_used)
        if not language:
            language = self.get_fallback_language(request)

        translation.activate(language)
        request.LANGUAGE_CODE = translation.get_language()

Эта строчка language = translation.get_language_from_request(request, check_path=i18n_patterns_used) -- в конце концов если везде пусто отдаст язык из request.META.get("HTTP_ACCEPT_LANGUAGE", ""), и если раньше блок
if (
            not language_from_path
            and i18n_patterns_used
            and not prefixed_default_language
        ):
перебивал это поведение то сейчас НЕТ, и нам летит язык /ru/ ! мне не нужно такое поведение, нужно чтобы / - был английский, не лезть же в джангу с дописками проверки, и версию понижать не вариант так как GeoIP2 корректно работает!, Кто чем может помочь?
  • Вопрос задан
  • 85 просмотров
Решения вопроса 2
dimonchik2013
@dimonchik2013
non progredi est regredi
Ответ написан
Комментировать
sergey_1990
@sergey_1990 Автор вопроса
1
Я рассматривал вариант промежуточного ПО, которое чистит HTTP_ACCEPT_LANGUAGE, но это грубовато, и ответы 13 лет, если это изменение в уже свежих версиях, есть же объяснение этому,
В ИТОГЕ, чтобы не буксовать на месте и не менять остальной код, добавил midleware который чистит этот заголовок, всё заработало, буду искать более правильное решение!
class FixLangMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if "HTTP_ACCEPT_LANGUAGE" in request.META:
            del request.META["HTTP_ACCEPT_LANGUAGE"]
        response = self.get_response(request)
        return response

и в settings.py
MIDDLEWARE = [
    "pages.middlewares.FixLangMiddleware",  

.....
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы