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

时间:2015-01-09 10:55:33

标签: django python-3.x login

这是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”,它将我带到登录页面。输入用户名和密码后,在“验证”中,打印语句打印“登录”到终端。

到目前为止一切顺利。现在,我不再被重定向到“/”,而是再次被重定向到“/ 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 个答案:

答案 0 :(得分:3)

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

编辑:您正在导入django.contrib.auth.login并在您的脚本中有一个名为login的函数 - 这些名称冲突,您的本地定义的函数“接管”。您应该重命名本地函数(我在下面将其称为login_view),或者将登录函数作为合格/不同的名称导入(例如,您可以执行from django.contrib.auth import 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/')
相关问题