已登录用户的访问限制

我们可以用 user_passes_test 装饰器,来达到限制用户访问的目的。

下面是一个实例,限制只有填写了email的用户才能访问该页面:

from django.shortcuts import render
from django.http import HttpResponse 
from django.contrib.auth.decorators import user_passes_test


def email_check(user):
    return user.email

@user_passes_test(email_check, login_url='no_email')
def test(request):
    return HttpResponse('填写了邮箱的用户才能进入!')

def no_email(request):
    return HttpResponse('你未填写邮箱!')

当没有填写 email 的用户访问:http://127.0.0.1:8000/test/ 时候,将会被跳转到:http://127.0.0.1:8000/no_email/?next=/test/

user_passes_test() 要求一个以 User 对象为参数的回调函数,若用户允许访问此视图,返回 True。

注意,user_passes_test() 不会自动检查 User 是否是不是匿名对象。




user_passes_test() 的额外的参数:
  • login_url
    让你指定那些没有通过检查的用户要跳转到哪里。若不指定其值,它可能是默认的 settings.LOGIN_URL。

  • redirect_field_name
    与 login_required() 的参数相同。把它设置为 None 来把它从 URL 中移除,当你想把通不过检查的用户重定向到没有 next page 的非登录页面时。

我们把上例的装饰器改成:

@user_passes_test(email_check, login_url='no_email', redirect_field_name=None)

跳转后就不会出现 ?next= 的字符,直接变成:http://127.0.0.1:8000/no_email/

你可能感兴趣的:(已登录用户的访问限制)