Django:登录后激活用户存储语言
我正在使用Python 3.6和Django 1.11。我正在使用基于Django类的身份验证视图和自定义用户模型。我的用户将他们的语言存储在数据库中。我想在每次登录后检索此语言并激活它 我希望通过Django:登录后激活用户存储语言,django,django-authentication,django-i18n,Django,Django Authentication,Django I18n,我正在使用Python 3.6和Django 1.11。我正在使用基于Django类的身份验证视图和自定义用户模型。我的用户将他们的语言存储在数据库中。我想在每次登录后检索此语言并激活它 我希望通过user\u logged\u insignal来实现这一点,但信号不能以任何方式影响响应,所以这是不可能的 另一种方法是覆盖默认的auth视图,这是我想要避免的 还有别的办法吗?谢谢。最后,我使用了最小的身份验证视图覆盖。我发现这比定制语言中间件要好,因为中间件会给每个请求增加一些开销,而这只在登录
user\u logged\u in
signal来实现这一点,但信号不能以任何方式影响响应,所以这是不可能的
另一种方法是覆盖默认的auth视图,这是我想要避免的
还有别的办法吗?谢谢。最后,我使用了最小的身份验证视图覆盖。我发现这比定制语言中间件要好,因为中间件会给每个请求增加一些开销,而这只在登录时执行。我已经重写了
get\u success\u 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
您仍然可以通过
翻译更改信号中的用户语言。激活(usr\u lan)
谢谢。是的,我可以使用activate
,但问题是请求有i18n路径(例如“/en/route/…”)LocaleMiddleware
优先考虑URL中的语言,因此这并不能解决问题。我必须能够重定向,而你不能从信号中重定向。好吧,用你的自定义CustomLocaleMiddleware
扩展LocaleMiddleware
怎么样,以及process\u请求
以某种方式获得lang和set?这是一个好建议,@RajaSimon,我会考虑的。