【问题标题】:Use cookie only for user language instead of opening session仅将 cookie 用于用户语言而不是打开会话
【发布时间】:2016-08-19 23:34:23
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    • 如果语言 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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-17
        • 2012-07-23
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多