具体来说,在身份验证和重定向之后,request.user是一个匿名用户。
登录(查看功能)
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid():
#django.contrib.auth.login
Login(request, form.get_user())
str = reverse('cm_base.views.index')
return HttpResponseRedirect(str)
else:
# Their password / email combination must have been incorrect
pass
else:
form = LoginForm()
return render_to_response('cm_base/login.html',
{"DEBUG": True,
'form' : form
},
context_instance=RequestContext(request))
在索引视图中,我删除了login_required装饰器并测试了request.user对象
def index(request):
test = request.user.is_authenticated()
return render_to_response('cm_base/index.html',
{"DEBUG": True,
"user": request.user,},
context_instance=RequestContext(request))
测试返回false。
修正
我最后只是直接调用索引视图。当我调用HttpResponseRedirect时,我仍然对用户对象丢失的原因感到困惑。
def login(request):
if request.method == 'POST':
form = LoginForm(request.POST) # Not shown in this example
if form.is_valid():
Login(request, form.get_user())
str = reverse('cm_base.views.index')
return index(request)
else:
# Their password / email combination must have been incorrect
pass
else:
form = LoginForm()
答案 0 :(得分:3)
这里发生的很多事情都不应该。首先,您不需要传递request.user
,只要您使用的是RequestContext
,就可以使用Login()
。
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def login_view(request):
form = LoginForm(request.POST or {})
ctx = {'form': form}
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username, password)
if not user:
ctx['errors'] = 'Invalid Login'
return render(request, 'login.html', ctx)
if not user.is_active:
ctx['errors'] = 'User is locked'
return render(request, 'login.html', ctx)
login(request, user)
return redirect('home')
else:
return render(request, 'login.html', ctx)
这种方法究竟是做什么的?如果您使用默认的身份验证后端,Django会提供您应该使用的built-in login
method。
您也没有检查用户是启用还是禁用。
以下是您的代码的不同版本,改编自example in the documentation:
{{1}}
答案 1 :(得分:0)
您使用的是什么身份验证后端?如果它不是ModelBackend,请确保你的get_user方法是正确的。听起来好像auth中间件正在发送一个不同的标识符(比如pk而不是用户名),而不是你在get_user方法中寻找的标识符。
答案 2 :(得分:-1)
这是修复
<link rel="icon" href="{{ STATIC_URL }}img/favicon.ico" />
静态目录中缺少此文件。结果404打破了用户会话。