0

在我的代码中,我正在使用@login_required装饰器。据我所知(并可以在URL中看到),这传递给我的登录视图下一个参数,用于保存用户所在的原始页面。 检查用户的凭据后,我试图将他重定向到原始页面,但我无法弄清楚如何去做。我相信这一定非常简单,但我一直坚持这一段时间,在扔掉键盘之前我不得不寻求帮助。 我的视图代码如下:Django - 成功登录后将用户重定向到“next”参数

from django.contrib.auth import login as auth_login, authenticate 

def login(request): 
form_class = LoginForm 

if request.method == 'POST': 
    form = form_class(data=request.POST) 
    if form.is_valid(): 
     username = request.POST['username'] 
     password = request.POST['password'] 
     user = authenticate(request, username=username, password=password) 
     if user is not None: 
      auth_login(request, user) 
      return redirect(?????????) 
     else: 
      #Error message 
return render(request, 'login.html', {'form':form_class}) 

回答

4

您检查成功登录后,您需要做的仅仅是这样的:

next_url = request.GET.get('next') 
if next_url: 
    return HttpResponseRedirect(next_url) 
else: 
    return render(request, 'main/main.html') 
+0

最后,它的工作原理!我知道这很容易做到。非常感谢! –

+2

请注意,您可能不希望盲目重定向到查询字符串中传递的任何旧url。这使得钓鱼攻击者可以在登录后基本上将用户重定向到任何域。如果这可能是一个问题,你可能想要回顾一下Django自己的内置auth包是如何清理'next_url'的。请参阅[Django Auth源代码](https://github.com/django/django/blob/master/django/contrib/auth/views.py)中的'get_redirect_url'函数。 – jonpa