Django:登录后激活用户存储的语言

时间:2017-07-14 18:33:02

标签: django django-authentication django-i18n

我正在使用Python 3.6和Django 1.11。我正在使用基于Django类的身份验证视图和自定义用户模型。我的用户将他们的语言存储在数据库中。我想在每次登录后检索这种语言并激活它。

我希望通过user_logged_in信号来做到这一点,但信号不会以任何方式影响响应,所以这是不可能的。

另一种方法是覆盖默认的身份验证视图,这是我想避免的。

还有其他方法吗?谢谢。

1 个答案:

答案 0 :(得分:3)

最后,我使用了最小的身份验证视图覆盖。我发现这比自定义语言中间件更好,因为中间件会为每个请求增加一些开销,而这只在登录时执行。我已经覆盖了get_success_url方法,因为它是在用户登录后调用的(我需要)并且我不想干扰登录/身份验证过程本身,因为这可能会引入安全性未来的洞。

from django.conf import settings
from django.contrib.auth.views import LoginView
from django.urls import translate_url
from django.utils.translation import activate, LANGUAGE_SESSION_KEY

# available languages should be obtained from settings.LANGUAGES
available_languages = [lang_code for (lang_code, lang_name) in settings.LANGUAGES]

class CustomLoginView(LoginView):
    def get_success_url(self):
        url = super(CustomLoginView, self).get_success_url()
        user = self.request.user
        if user.is_authenticated():
            language = user.get_setting('language')

            if language in available_languages:
                url = translate_url(url, language)
                activate(language)
                if hasattr(self.request, 'session'):
                    self.request.session[LANGUAGE_SESSION_KEY] = language

        return url