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

Django: activate user-stored language after login

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

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

另一种方法是覆盖默认的授权视图,这是我想避免的。

还有其他办法吗?谢谢。

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

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