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/