django - Django 2 中的自定义 LoginView

标签 django django-2.0

我正在尝试在 Django 2 中自定义身份验证和 View ,但问题是,如果用户已经通过身份验证,则仍会显示登录表单,并且不会重定向到适当的 URL。为了克服这个问题,我做了以下工作:

class CustomLoginView(LoginView):

    form_class = LoginForm
    template_name = 'login.html'

    def get_initial(self):
        if self.request.user.is_authenticated and self.request.user.is_staff and has_2fa(self.request.user):
            return HttpResponseRedirect(reverse('{}'.format(self.request.GET.get('next', 'portal_home'))))
        else:
            return self.initial.copy()

    def form_valid(self, form):

        if self.request.user.is_staff and not has_2fa(self.request.user):
            logger.info('is staff but does not have 2FA, redirecting to Authy account creator')
            auth_login(self.request, form.get_user())
            return redirect('2fa_register')
        auth_login(self.request, form.get_user())

        return HttpResponseRedirect(self.get_success_url())

但是get_initial()中的HttpResponseRedirect不会重定向到/portal/页面。我也尝试过 redirect('portal_home') 但没有任何反应,还是我需要编写自定义 dispatch

任何帮助将不胜感激。

最佳答案

重写 get() 可以解决问题,请参阅 https://docs.djangoproject.com/en/dev/ref/class-based-views/mixins-editing/#django.views.generic.edit.ProcessFormView

class CustomLoginView(LoginView):
    """
    Custom login view.
    """

    form_class = LoginForm
    template_name = 'login.html'

    def get(self, request, *args, **kwargs):
        if self.request.user.is_authenticated and self.request.user.is_staff and has_2fa(self.request):
            return redirect('{}'.format(self.request.GET.get('next', 'portal_home')))

        return super(CustomLoginView, self).get(request, *args, **kwargs)

    def form_valid(self, form):

        if self.request.user.is_staff and not has_2fa(self.request):
            logger.info('is staff but does not have 2FA, redirecting to Authy account creator')
            auth_login(self.request, form.get_user(), backend='django.contrib.auth.backends.ModelBackend')
            return redirect('2fa_register')

        return super(CustomLoginView, self).form_valid(form)

关于django - Django 2 中的自定义 LoginView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879319/

相关文章:

django - 在django模板中获取用户信息

python - Django - 通过外键排序

javascript - Django 休息框架 : custom pagination next/previous links

python - 如何从不同模型获取查询集的 json 响应列表?

python - Django 2.0 与关键字参数 uidb64 的 NoReverseMatch

python - 从 dict 生成 django 2.0 模型

django - 如何解决 django 开发服务器上的巨大延迟?

python - FactoryBoy - 嵌套工厂/最大深度?

python - 如何在 Django 的查询集中传递两个以上的参数?

采用 json 对象的 Python 函数返回 mongodb 查询对象