簡單的認證
@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/