咱們在開發項目的時候,不免要遇到用戶權限的問題,例如這個用戶是否是能夠訪問這個頁面,是否是能夠登陸,帳號是否是已通過期了等等的緣由,django給咱們提供了auth模塊,能很方便的解決咱們的這些問題。html
django給咱們提供了一個後臺管理系統,咱們先來建立一個超級用戶,在項目跟目錄下執行下面命令python
python manage.py createsuperuser
執行成功以後,咱們就在默認的auth_user表裏建立了一個用戶數據庫
咱們能夠登陸到後臺看看django
User下的數據就是咱們數據表auth_user裏的數據,方便咱們進行數據的更改。後端
給咱們提供了用戶認證功能,就是驗證咱們的用戶名和密碼是否是正確的。通常須要username和password兩個參數,若是認證成功,則返回一個User對象,若是認證失敗,則返回Nonecookie
authenticate()會在該 User 對象上設置一個屬性來標識後端已經認證了該用戶,且該信息在後續的登陸過程當中是須要的。session
咱們能夠寫一個登陸函數,來判斷咱們輸入的用戶名和密碼是否是正確的,咱們上面已經註冊了一個帳號和密碼app
1 from django.contrib import auth 2 3 4 def login(request): 5 if request.method == 'POST': 6 username = request.POST.get('username') 7 pwd = request.POST.get('pwd') 8 obj = auth.authenticate(request, username=username, password=pwd) 9 print(obj) 10 if obj: 11 return redirect('/index/') 12 13 return render(request, 'login.html')
代碼解釋:函數
第八行咱們經過authenticate進行判斷用戶名和密碼是否是正確,裏面有三個參數,第一個是request,第二個是用戶名,前面的username是數據庫裏的字段名,後面的是用戶輸入的值,第三個是密碼。若是驗證經過,則obj是一個User對象,若是驗證失敗,則obj爲Noneui
該函數實現一個用戶登陸的功能,它會在後端爲該用戶生成一個seeeion數據,存在django_session表裏。
該函數接收一個HttpRequest對象,以及一個通過認證的User對象。
1 def login(request): 2 if request.method == 'POST': 3 username = request.POST.get('username') 4 pwd = request.POST.get('pwd') 5 obj = auth.authenticate(request, username=username, password=pwd) 6 if obj: 7 auth.login(request, obj) # obj是上面認證返回的對象 8 return redirect('/index/') 9 return render(request, 'login.html')
這樣,當咱們執行到第七行的時候,會自動爲咱們生成session。
當調用該函數時,當前請求的session信息會所有清除,該用戶即便沒有登陸,使用該方法也不會報錯,接收一個HttpRequest對象,無返回值。
咱們在上面登陸成功以後會進入到index頁面,在index視圖裏寫個註銷的功能
def index(request): auth.logout(request) # 清除用戶的session數據 return redirect('/login/')
有些頁面咱們須要用戶登陸成功以後才能訪問,在以前咱們經過給設置cookie,獲取cookie的方法來判斷,django給咱們提供了這樣的功能,使用裝飾器login_requierd()就能實現,首先須要導入
from django.contrib.auth.decorators import login_required
咱們給index視圖加上裝飾器,在沒登陸的狀態下訪問
from django.contrib.auth.decorators import login_required @login_required # 使用裝飾器添加登陸校驗 def index(request): return HttpResponse('index')
django報錯,提示咱們
Not Found: /accounts/login/
這是由於若是沒有登陸,django會跳轉到 /accounts/login/ 這個路由,由於這個咱們沒有定義,因此會報錯,咱們把login改爲 /accounts/login/ 就會跳轉到登陸頁面了,若是不想改,就想用login。能夠在settings.py里加上下面的代碼
LOGIN_URL = '/login/' # 這裏配置成你項目登陸頁面的路由
這樣咱們就能使用咱們自定義的路由了,訪問index頁面,若是沒有登陸,跳轉的路由爲
http://127.0.0.1:8000/login/?next=/index/
在上面登陸的視圖函數裏,咱們登陸成功後會訪問固定的頁面index,可是咱們多是從home頁面訪問的,登陸以後還想回到home頁面,這時咱們就能夠修改login視圖函數了
def login(request): if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') obj = auth.authenticate(request, username=username, password=pwd) if obj: auth.login(request, obj) # obj是上面認證返回的對象 next_page = request.GET.get('next') # django給咱們提供的參數是next,因此咱們經過next拿到對應的值,在經過重定向跳轉到對應的頁面 if next_page: return redirect(next_page) return HttpResponse('ok') return render(request, 'login.html')
用來判斷當前請求是否經過了認證,經過了返回True,沒經過返回False
from django.contrib.auth.decorators import login_required def login(request): if request.method == 'POST': username = request.POST.get('username') pwd = request.POST.get('pwd') obj = auth.authenticate(request, username=username, password=pwd) if obj: auth.login(request, obj) # obj是上面認證返回的對象 next_page = request.GET.get('next') # django給咱們提供的參數是next if next_page: return redirect(next_page) return HttpResponse('ok') return render(request, 'login.html') @login_required # 使用裝飾器添加登陸校驗 def index(request): print(request.user, type(request.user)) # 當前的用戶對象 print(request.user.is_authenticated()) # 判斷當前用戶是否登陸 return HttpResponse('index')
建立新用戶的方法,必需要提供username,password參數。也能夠指定其餘參數
要導入對應的模塊
from django.contrib.auth.models import User
from django.contrib.auth.models import User def register(request): if request.method == 'POST': user = request.POST.get('username') pwd = request.POST.get('password') User.objects.create_user(username=user, password=pwd) # 建立一個用戶 return redirect('/login/') return render(request, 'register.html')
指定其餘參數,數據庫裏要有這個字段
User.objects.create_user(is_staff=1,username=user, password=pwd)
建立一個超級用戶,能夠登陸到後臺
語法和上面的同樣
from django.contrib.auth.models import User User.objects.create_superuser(email='',username=user, password=pwd) # 有三個參數,email在這裏寫死了
auth 提供的一個檢查密碼是否正確的方法,須要提供當前請求用戶的密碼。
密碼正確返回True,不然返回False。
user.check_password('密碼')
auth 提供的一個修改密碼的方法,接收 要設置的新密碼做爲參數。
注意:要使用save()方法才能保存到數據庫裏面
from django.contrib.auth.models import User user.set_password(password='新密碼') user.save()
django雖然給咱們提供了user表來存儲用戶的註冊帳號等信息,但不能知足咱們實際項目的需求,好比咱們還須要用戶填地址,手機號等等信息。
咱們能夠經過繼承內置的 AbstractUser 類,來定義一個本身的Model類。
from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser): addr = models.CharField(max_length=32) phone = models.CharField(max_length=11)
注意:
按上面的方式擴展了內置的auth_user表以後,必定要在settings.py中告訴Django,我如今使用我新定義的UserInfo表來作用戶認證。寫法以下:
# 引用Django自帶的User表,繼承使用時須要設置 AUTH_USER_MODEL = "app名.UserInfo"
一旦咱們指定了新的認證系統所使用的表,咱們就須要從新在數據庫中建立該表,而不能繼續使用原來默認的auth_user表了。