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

Use cookie only for user language instead of opening session

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

切换语言导致为每个[匿名]用户设置会话令牌。我怎样才能避免这种情况并仅使用 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'

您可以通过编写自己的中间件来做到这一点:

  • 创建一个语言 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  )
        """

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

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

  • 它在客户端的浏览器缓存中占有一席之地。
  • 更重要的是,你正在做一些危险的事情。现在数据存在于客户端的浏览器而不是您的数据库中。您可能认为语言数据并不重要,但还有更多数据可以利用。

如果您抱怨大量会话密钥,您应该稍后删除会话密钥(也许在浏览器关闭时?)。由你决定。