Почему solid i18n перенаправляет обратно на предыдущий язык?

Я работаю на старой версии Django (1.8) и использую solid-i18n==1.3.0 для поддержки использования языка по умолчанию, например, английского, как / вместо /en.

Моя проблема в том, что в продакшене страница, сессии которой установлены на испанский язык, при выборе любого другого языка перенаправляется дважды: сначала на выбранный язык, а затем обратно на испанский.

Это сессия на испанском языке:

>>> from django.contrib.sessions.models import Session as Sess
>>> s = Sess.objects.get(pk='f2l3drtob4ox797ohcwantp4xfrb4r5u')
>>> s.get_decoded()['_language']
u'es'

А это цепочка запросов:

enter image description here

Тело POST запроса selectlang/ имеет вид:

csrfmiddlewaretoken=xxxxxxxxxxxxxxxxxxxx&next=%2Fedit%2Fxxxxxxxxxxxxxxxxxxxxx&language=en

Меня смущает третий запрос: почему он возвращается на страницу /es/edit/xxxxxxxx?

Мои настройки i18n следующие:

SOLID_I18N_USE_REDIRECTS = True
# SOLID_I18N_HANDLE_DEFAULT_PREFIX = True
# SOLID_I18N_DEFAULT_PREFIX_REDIRECT = True  # not working, redirects to "en" back again

А представление, на которое указывает URL selectlang/, является пользовательским:

def select_language(request):
    """
    Just like `django.views.i18n.set_language` but adds `translation.activate(lang_code)` because of an issue
    with solid_i18n not redirecting to the default language (no path) when selected.
    """
    next = request.POST.get('next', request.GET.get('next'))
    if not is_safe_url(url=next, host=request.get_host()):
        next = request.META.get('HTTP_REFERER')
        if not is_safe_url(url=next, host=request.get_host()):
            next = '/'
    response = http.HttpResponseRedirect(next)
    if request.method == 'POST':
        lang_code = request.POST.get('language', None)
        if lang_code and check_for_language(lang_code):
            if hasattr(request, 'session'):
                request.session[LANGUAGE_SESSION_KEY] = lang_code
                request.session['user_lang'] = lang_code  # to override association default language
            else:
                response.set_cookie(_settings.LANGUAGE_COOKIE_NAME, lang_code,
                                    max_age=_settings.LANGUAGE_COOKIE_AGE,
                                    path=_settings.LANGUAGE_COOKIE_PATH,
                                    domain=_settings.LANGUAGE_COOKIE_DOMAIN)
            translation.activate(lang_code)  # added so that it redirects properly to the selected language
    return response

Вы можете найти твердый класс i18n middleware SolidLocaleMiddleware здесь, на всякий случай, если вы не можете найти источник для 1.3.0.

Я не смог отладить это локально, где я могу правильно переключать языки, и он никогда не запускает второе "перенаправление" обратно на исходный язык.

Пожалуйста, откажитесь от комментариев типа "просто обновите уже свои версии". Это не зависит от меня.

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