django 权限功能(根据不同的用户,设置不同的显示和访问权限)

简单的认证

@Login_required 装饰器

判断是否登陆,没有就自动重定向某个地方

用法:(局限于装饰函数)(如果要装饰一个类,则不能,要使用method_decorator)

@login_required(login_url='users:login')
def index_fn(reuqest):
    return HttpResponse('大家都是大牛')

自动跳转到login页面

登陆后:

@method_decorator装饰器

@method_decorator(login_required(login_url='users:login'),name='dispatch')
class Index(View):
    def get(self, request):
        return render(request, 'admin/index.html', context={'request': request})

用法基本一样也就是一个是类视图一个是函数视图。

但是是否每一个都需要添加呢?不符合优秀程序员的做法(手动滑稽)因为实在是太丑了。

Minxin认证

LoginRequired Mixin

需要设定重定向的URL(有一点restful的风格)

class Index(LoginRequiredMixin,View):
    login_url = 'users:login'
    def get(self, request):
        return render(request, 'admin/index.html', context={'request': request})

聪明的看得出来了,是否每一次都添加login_url呢,这里显然不是的,可以将login_url设置在Settings里面,我的Mixin会自动去settings里面寻找LOGIN_URL的参数。

 

?next=/admin/        可以自定义next 

@login_required(redirect_field_name='my_redirect_field') 这样就可以代替next

自动帮我们添加一个查询的参数在URL上面。

user_passes_test 

这个比较通用于函数视图

以下为官方文档。 描述为判断登陆的用户的邮箱以‘@example.com’结尾,就为True,允许访问,如果相反,那么就禁止访问。可自定义

userPassesTestMixin

这个通用于类视图。

class Index(UserPassesTestMixin,View):
    def test_func(self):
        return self.request.user.username.endswith('son')

    def get(self, request):
        return render(request, 'admin/index.html', context={'request': request})

test_func为Mixin所定的。测试是否通过,为TRUE则可以进入,FALSE为相反。

权限

permission_required decorator 

首先这里要注意权限和认证的区别,认证给你登陆了,但不一定给你看某些好看的东西。除非微信转钱。

permission_required(perm.login_url=None,raise_exception=False)

perm为权限多个权限就可以用一个列表或者元组都行。放在函数视图里面。

 perm 第一部分模型名字    第二部分为codename

permissionRequiredMixin mixin 

使用于类视图里面。

lass TagManage(PermissionRequiredMixin,View):
    """
    create tags manage view
    route: admin/tags/int
    """
    permission_required = ('news.add_tag', 'news.view_tag')
    raise_exception = True # 403
    def get(self, request):

没有权限直接403

 

未完待续。https://docs.djangoproject.com/en/3.0/topics/auth/default/

 

 

posted @ 2020-04-27 16:35  我和姚明一样高  阅读(3143)  评论(0编辑  收藏  举报