Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:登录后激活用户存储语言_Django_Django Authentication_Django I18n - Fatal编程技术网

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视图,这是我想要避免的 还有别的办法吗?谢谢。最后,我使用了最小的身份验证视图覆盖。我发现这比定制语言中间件要好,因为中间件会给每个请求增加一些开销,而这只在登录

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

我希望通过
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,我会考虑的。