这是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
您忘记了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/')