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
我正在使用 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