Django 2 中的自定义登录视图
Custom LoginView in Django 2
我正在尝试在 Django 2 中自定义身份验证和视图,但问题是如果用户已经通过身份验证,登录表单仍会显示,并且不会重定向到适当的 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)
@Akshay 我找到了一个干净且更实用的解决方案。 LoginView 有一个属性“redirect_authenticated_user”,只需设置 URL name/path.
我正在尝试在 Django 2 中自定义身份验证和视图,但问题是如果用户已经通过身份验证,登录表单仍会显示,并且不会重定向到适当的 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)
@Akshay 我找到了一个干净且更实用的解决方案。 LoginView 有一个属性“redirect_authenticated_user”,只需设置 URL name/path.