7

具体来说,经过身份验证和重定向后,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))

测试返回假。

使固定

我最终只是直接调用索引视图。我仍然对调用 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()
4

3 回答 3

4

这里发生了很多不应该发生的事情。首先,你不需要通过request.user,只要你使用它,它默认可用RequestContext,你就是。

Login()这个方法,它到底在做什么?Django 提供了一个内置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)
于 2013-08-23T15:28:56.653 回答
1

您使用的是什么身份验证后端?如果它不是 ModelBackend ,请确保您的 get_user 方法是正确的。听起来好像 auth 中间件正在发送与您在 get_user 方法中查找的标识符不同的标识符(例如 pk 而不是用户名)。

于 2013-05-09T15:06:56.487 回答
-1

这是修复

<link rel="icon" href="{{ STATIC_URL }}img/favicon.ico" />

静态目录中缺少此文件。结果 404 正在中断用户会话。

于 2013-08-23T14:57:43.287 回答