即使多次尝试登录,也可以在django中使用next重定向



我有这样的登录视图:

def login(request):
if request.user.is_authenticated:
return redirect('/')
else:
if request.method == "POST":
email=request.POST['email']
password=request.POST['password']
user=auth.authenticate(email=email,password=password)
if user is not None:
auth.login(request, user)
next_page = request.POST['next']
if next_page != '':
return redirect(next_page)
else:
return redirect('/')
else:
messages.info(request,"Email Password didn't match")
return redirect('login')
else:
return render(request,"login.html")

在这种情况下,如果用户来到一个需要登录的页面,那么他将被重定向到登录页面,当他成功登录时,他将被重新定向到他来自的页面。但是,当用户第一次尝试时没有登录(输入错误的电子邮件或密码(,然后重新加载登录页面,如果他成功登录,则不会重定向到他来自的页面时,就会出现问题。我该如何解决这个问题,这样无论用户尝试登录的次数如何,他都会被重定向到他来自的同一页面。

我看到您正在使用POST获取下一个url,并正在重定向。因此,每当登录失败并重定向到登录页面时,必须在表单中设置next

默认情况下,django具有登录后重定向到下一页的功能:docs

redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

您可以生成URL并将其传递给reverse。您不需要为此创建另一个URL模式。下一个url必须作为登录链接中的GET参数传递。

from django.urls import reverse
from urllib.parse import urlencode
def login(request):
if request.user.is_authenticated:
return redirect('/')
else:
if request.method == "POST":
#code
next = request.POST['next']
if user is not None:
auth.login(request, user)
if next_page != '':
return redirect(next_page)
else:
return redirect('/')
else:
messages.info(request,"Email Password didn't match")
login_url = reverse('login') # get the login url
query_string =  urlencode({'next': next})
url = '{}?{}'.format(login_url, query_string) # create the url
return redirect(url)
else:
return render(request,"login.html")

最新更新