我正在使用Python 3.6和Django 1.11。我正在使用基于Django类的身份验证视图和自定义用户模型。我的用户将他们的语言存储在数据库中。我想在每次登录后检索这种语言并激活它。
我希望通过user_logged_in
信号来做到这一点,但信号不会以任何方式影响响应,所以这是不可能的。
另一种方法是覆盖默认的身份验证视图,这是我想避免的。
还有其他方法吗?谢谢。
答案 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