仅将cookie用于用户语言而不是打开会话

时间:2016-04-26 08:49:41

标签: django cookies django-sessions django-i18n django-1.9

我在我的网站上设置了多种语言和翻译,它们运行良好。在我的页面上添加了语言切换控件。

切换语言导致为每个[匿名]用户设置会话令牌。如何避免这种情况并使用 only cookie 进行本地化?我的意思是不使用会话,但在cookie中使用类似“{language:'en'}”的东西,自动处理?

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'

2 个答案:

答案 0 :(得分:2)

您可以通过编写自己的中间件来实现:

  • 如果语言cookie不存在,请创建一个语言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

答案 1 :(得分:1)

我不建议直接将数据存储在cookie中。

  • 它占据了客户端浏览器缓存中的一个位置。
  • 更重要的是,你正在做一些危险的事情。现在数据存在于客户端的浏览器而不是数据库中。您可能会看到语言数据不重要,但还有更多可以利用的语言数据。

如果您抱怨大量的会话密钥,您应该在稍后删除会话密钥(可能是在浏览器关闭时?)。它取决于你。