仅将 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 中。
- 它在客户端的浏览器缓存中占有一席之地。
- 更重要的是,你正在做一些危险的事情。现在数据存在于客户端的浏览器而不是您的数据库中。您可能认为语言数据并不重要,但还有更多数据可以利用。
如果您抱怨大量会话密钥,您应该稍后删除会话密钥(也许在浏览器关闭时?)。由你决定。
我在我的网站上设置了多种语言和翻译,它们运行良好。在我的页面添加了语言切换控件。
切换语言导致为每个[匿名]用户设置会话令牌。我怎样才能避免这种情况并仅使用 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 中。
- 它在客户端的浏览器缓存中占有一席之地。
- 更重要的是,你正在做一些危险的事情。现在数据存在于客户端的浏览器而不是您的数据库中。您可能认为语言数据并不重要,但还有更多数据可以利用。
如果您抱怨大量会话密钥,您应该稍后删除会话密钥(也许在浏览器关闭时?)。由你决定。