提问者:小点点

Django即使在登录后也会重定向到登录页面


这是views.py的内容:


    @login_required
    def home_page(request):
        return HttpResponse("hello " + str(request.user))

    def login(request):
        return render(request, 'login.html')

    def verify(request):
        u = request.POST['username']
        p = request.POST['password']
        user = authenticate(username=u, password=p)
        if user is not None:
            if user.is_active:
                login(request)
                print("logged in")
                return HttpResponseRedirect('/')
        else:
            return HttpResponseRedirect('/accounts/login/')

在转到“/”时,我被重定向到“/accounts/login”,它将我带到登录页面。我输入用户名和密码后,在“验证”打印语句printd“登录”到终端。

到目前为止还不错。现在,我不再被重定向到“/”,而是再次被重定向到“/accounts/login”,并再次显示输入用户名和密码的页面。为什么?


    [09/Jan/2015 10:50:14] "GET / HTTP/1.1" 302 0
    [09/Jan/2015 10:50:14] "GET /accounts/login/?next=/ HTTP/1.1" 200 250
    logged in
    [09/Jan/2015 10:50:19] "POST /accounts/verify/ HTTP/1.1" 302 0
    [09/Jan/2015 10:50:19] "GET / HTTP/1.1" 302 0
    [09/Jan/2015 10:50:19] "GET /accounts/login/?next=/ HTTP/1.1" 200 250


共1个答案

匿名用户

您忘记了login的第二个参数,它是用户对象。这将导致登录失败,因此当您重定向到首页(其中有@login_required)时,您将被送回登录表单以“再次登录”。看看文件。

编辑:您既要导入django.contrib.auth.login,又要在脚本中有一个名为login的函数--这些名称发生冲突,您的本地定义函数将“接管”。您应该重命名本地函数(我在下面将其称为login_view),或者将登录函数导入为限定的/不同的名称(例如,您可以从django.contrib.auth导入authenticate,login as login_user)

from django.contrib.auth import authenticate, login

@login_required
def home_page(request):
    return HttpResponse("hello " + str(request.user))

def login_view(request):
    return render(request, 'login.html')

def verify(request):
    u = request.POST['username']
    p = request.POST['password']
    user = authenticate(username=u, password=p)
    if user is not None:
        if user.is_active:
            # You need to call `login` with `request` AND `user`
            login(request, user)
            print("logged in")
            return HttpResponseRedirect('/')
    else:
        return HttpResponseRedirect('/accounts/login/')