Django @login_required装饰

时间:2014-11-20 19:57:49

标签: python django views login-required

在撰写观点时,使用@login_required装饰器显然是一种很好的做法 - 如果不是强制性的话。

但是 - 只检查验证

的用户
from django.contrib.auth.models import User

我想要完成的是还要检查用户是否存在为UserProfile。 例如,在我的应用程序中,我有一些UserProfiles。所有人都有与之相关的用户对象。 但我也有其他用户没有UserProfile。这样的用户是我的管理员用户。 我想确保请求来自具有UserProfiles(并且经过身份验证)的用户。

有没有办法更改装饰器来支持它? 目前我只是写了自己的代码来做到这一点:

def user_login(request):
  context = context = RequestContext(request)

  if request.method == 'POST':
    username = request.POST['username']
    password = request.POST['password']
    try:
      user = authenticate(username=username, password=password)
      user_profile = user.userprofile
    except (ObjectDoesNotExist,AttributeError) as e:
      # username and password only prompted for debug purposes.
      error_msg = "Invalid login details: {0}, {1}".format(username, password)
      print (error_msg)
      # print (request)
      # return HttpResponse("Invalid login details supplied.")
      return render(request, 'bz/login.html', {'error_msg': error_msg})

    if user and user_profile:
      if user.is_active:
        login(request,user)
        # return HttpResponse("You're now logged in as " + username)
        # return render(request, 'bz/index.html', {})
        return render(request, 'bz/index.html', {'userprofile': user_profile})
        # return HttpResponseRedirect('bz/login.html')
      else:
        error_msg = "Your account is disabled"
        print (error_msg)
        return render(request, 'bz/login.html', {'error_msg': error_msg})
        # return HttpResponse(error_msg)
    else:
      error_msg = "Invalid login details: {0}, {1}".format(username, password)
      print (error_msg)
      return render(request, 'bz/login.html', {'error_msg': error_msg})
      # return HttpResponse("Invalid login details supplied.")
  else:
    if request.user.is_authenticated():
      return render(request, 'bz/index.html', {})
    else:
      return render(request, 'bz/login.html', {})

非常感谢您的意见。 谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用user_passes_test装饰器来执行检查用户配置文件的功能

e.g。

def has_user_profile(user):
    #return a True if one exists, else False

@login_required
@user_passes_test(has_user_profile)
def my_view(request):
    ...