Использовать cookie только для языка пользователя вместо открытия сеанса

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

Переключение языка вызывает установку токена сеанса для каждого [анонимного] пользователя. Как я могу этого избежать и использовать для локализации только файлы cookie? Я имею в виду, что не использовать сеанс, а использовать что-то вроде "{language: 'en'}" в файлах cookie, обрабатываемых автоматически?

Конфигурация settings.py содержит эти параметры, а также пути к языкам и т. д .:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

LANGUAGE_COOKIE_NAME = 'language'

person Croll    schedule 26.04.2016    source источник


Ответы (2)


Вы можете сделать это, написав собственное промежуточное ПО, которое:

  • Создайте языковой файл cookie, если он еще не существует.

  • Установите язык в соответствии с файлом cookie.

Итак, вы можете написать что-то вроде этого:

from django.utils import translation


class LanguageCookieMiddleware():

    def process_request(self, request):
        """
        Sets language from the cookie value.
        """
        if request.COOKIES.has_key(COOKIE_NAME):
            language = request.COOKIES.get(COOKIE_NAME)
            # You should add here some code to check teh language
            # variable is safe...
            translation.activate(language)
            request.LANGUAGE_CODE = translation.get_language()

    def process_response(self, request, response):
        """
        Create cookie if not there already.

        Also deactivates language.
        (See http://stackoverflow.com/a/13031239/388835 )
        """

        if not request.COOKIES.has_key(COOKIE_NAME):
            response.set_cookie(HTTP_COOKIE_NAME,
                                function_for_language_code_you_want())
        translation.deactivate()
        return response
person mimo    schedule 26.04.2016

Я бы не рекомендовал напрямую хранить данные в куки.

  • Он занимает место в кеше браузера клиента.
  • Что еще более важно, вы делаете что-то опасное. Теперь данные хранятся в браузере клиента, а не в вашей базе данных. Вы можете увидеть, что языковые данные не важны, но есть еще кое-что, чем можно воспользоваться.

Если вы жалуетесь на большое количество ключей сеанса, вам следует удалить ключ сеанса через некоторое время (может быть, при закрытии браузера?). Тебе решать.

person K.Yazoglu    schedule 14.04.2018