这是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
答案 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/')