具体来说,经过认证和重定向后,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))
在索引 View 中,我删除了 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))
测试返回假。
修复
我最终只是直接调用索引 View 。我仍然很困惑为什么当我调用 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()
最佳答案
这里发生了很多不应该发生的事情。首先,你不需要通过request.user
,只要您使用 RequestContext
,它就默认可用,你是。Login()
这个方法,究竟是做什么的? Django 提供了一个 built-in login
method如果您使用默认身份验证后端,则应该使用。
您也不会检查用户是否已启用或禁用。
这是您的代码的不同版本,改编自 example in the documentation :
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 : request. 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16119155/