一、auth系統
auth系統的數據表
#User:User是auth模塊中維護用戶信息的關系模式(繼承了models.Model), 數據庫中該表被命名為auth_user. #Group:User對象中有一個名為groups的多對多字段, 多對多關系由auth_user_groups數據表維護。Group對象可以通過user_set反向查詢用戶組中的用戶。 #Permission:Django的auth系統提供了模型級的權限控制, 即可以檢查用戶是否對某個數據表擁有增(add), 改(change), 刪(delete)權限。
User模型常用屬性和方法
username #用戶名 email #郵箱 groups #多對多的組 user_permissions #多對多的用戶權限 is_staff #是否是admin的管理員 is_active #是否激活,判斷該用戶是否可用 is_superuser #是否是超級用戶 last_login #上次登錄時間 dete_joined #注冊時間 is_authenticated #是否驗證通過了 is_anonymous #是否是匿名用戶 set_password(raw_password) #設置密碼,傳原生密碼進去 check_password(raw_password) #檢查密碼 has_perm(perm) #判斷用戶是否有某個權限 has_perm(perm_list) #判斷用戶是否有權限列表中的某個列表
auth認證系統的功能
create_user #創建用戶 authenticate #驗證登錄 login #記住用戶的登錄狀態 logout #退出登錄 is_authenticated #判斷用戶是否登錄 login_required #判斷用戶是否登錄的裝飾器
運用auth系統
from django.shortcuts import render,reverse,redirect from .forms import RegisterForm,LoginForm from .models import UserModel # Create your views here. from django.contrib.auth.models import User,Permission,Group #從auth系統導入User,Permission,Group 表 from django.contrib.auth import login,logout,authenticate #導入login,logout,authenticate三個方法 def home(request): return render(request,'login/home.html') def register(request): if request.method == 'GET': return render(request,'login/register.html') if request.method == 'POST': form = RegisterForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') password_repeat = form.cleaned_data.get('password_repeat') email = form.cleaned_data.get('email') if password == password_repeat: # UserModel.objects.create(username = username,password = password,email = email) User.objects.create_user(username=username,password=password,email=email) #用create_user自動給密碼加密 return redirect(reverse('login_login')) else: return redirect(reverse('login_register')) return redirect(reverse('login_register')) return redirect(reverse('login_register')) def login_view(request): if request.method == 'GET': return render(request,'login/login.html') if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') # user = UserModel.objects.filter(username=username,password=password) user = authenticate(username=username,password=password) #自動驗證數據庫是否有該用戶,自動密碼解密 if user: # request.session['username'] = username login(request,user) #這種方式實現登錄狀態 return redirect(reverse('login_home')) else: return redirect(reverse('login_register')) return redirect(reverse('login_register')) else: return redirect(reverse('login_register')) def logout_view(request): # request.session.flush() logout(request) #這種方式實現退出用戶 return render(request,'login/login.html')
二、設置blog主頁的登錄權限
為了實現在進入博客頁面之前必須得登錄(就是設置登錄權限)
#1、setting.py最后添加 LOGIN_URL = '/login/login' #把這個頁面設置成登錄頁面,只要沒登錄就會跳轉這個頁面 #2、在想要設置權限的地方加上裝飾器,在blog的app主頁里面添加 from django.contrib.auth.decorators import login_required,permission_required @login_required #實現登錄權限;想要進入這個頁面,如果沒有登錄,就會跳轉到默認登錄頁面 def index(request): ''' 主頁 ''' return render(request,'blog/demo_index.html') #3、為了用戶體驗而言,實現登錄用戶后直接跳轉到博客頁面而不是主頁,從GET里面獲取next的url,在保持用戶登錄狀態之后添加代碼 if user: # request.session['username'] = username login(request,user) #這種方式實現登錄狀態 next_url = request.GET.get('next') #為了用戶體驗而言,實現登錄用戶后直接跳轉到博客頁面而不是主頁,從GET里面獲取next的url if next_url: #如果存在,跳轉到該url return redirect(next_url) return redirect(reverse('login_home'))
三、關於權限
#在auth系統當中,django已經為我們提供了一個用戶身份驗證,用戶組和權限管理這些功能, 那么就可以使用它來完善我們現有的這個項目.
修改用戶密碼
def test(request): xcc = User.objects.filter(username='xuchengcheng').first() xcc.set_password('qwe123') #修改密碼 xcc.save() return HttpResponse(111111)
設置添加博客權限
@permission_required('blog.add_blogmodel') #設置app名blog下的add_blogmodel權限,用戶必須有這個權限才能添加博客 def add(request): ''' 添加頁 ''' pass
添加權限方式
def test(request): #給小明一個添加博客的權限 xiaoming = User.objects.filter(username='xiaoming').first() #獲取用戶 add_blog_permission = Permission.objects.filter(codename='add_blog').first() #獲取權限 xiaoming.user_permissions.add(add_blog_permission) #給用戶添加權限 #給組增加一個添加博客的權限,將用戶放入這個組里面就可以實現添加博客權限 g1 = Group() g1.name = 'add_blog_permission' #設置組 g1.save() g1.permissions.add(add_blog_permission) #給組添加權限 g1 = Group.objects.filter(name='add_blog_permission') xiaohong = User.objects.filter(username='xiaohong').first() print(xiaohong) g1.user_set.add(xiaohong) #將小紅添加到這個組 return HttpResponse(111111)