重定向后未设置 Django : request. 用户

标签 django authentication

具体来说,经过认证和重定向后,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/

相关文章:

带有 jquery-tinymce 图片上传插件的 Django

java - UnsupportedOperationException getUserPrincipal

node.js - Passport 使用 NextJs 和 Express 对每个请求调用 deserializeUser

PHP如何选择特定的SQL单元格并存储在变量中

python - 如何在 Pootle 中按总体完成情况显示排序列表

Django:一次保存多个对象信号

没有 django 的 Python 单元测试

django - Disqus 没有为该线程设置正确的 URL。为什么?

authentication - 我如何在 Netbeans 12.0 中使用 Github token ?

javascript - 无法使用 Internet Explorer 11 登录 Firebase