django -- auth模塊

前戲

咱們在開發項目的時候,不免要遇到用戶權限的問題,例如這個用戶是否是能夠訪問這個頁面,是否是能夠登陸,帳號是否是已通過期了等等的緣由,django給咱們提供了auth模塊,能很方便的解決咱們的這些問題。html

django給咱們提供了一個後臺管理系統,咱們先來建立一個超級用戶,在項目跟目錄下執行下面命令python

python manage.py createsuperuser

執行成功以後,咱們就在默認的auth_user表裏建立了一個用戶數據庫

咱們能夠登陸到後臺看看django

User下的數據就是咱們數據表auth_user裏的數據,方便咱們進行數據的更改。後端

authenticate

給咱們提供了用戶認證功能,就是驗證咱們的用戶名和密碼是否是正確的。通常須要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

 login()

該函數實現一個用戶登陸的功能,它會在後端爲該用戶生成一個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。

logout()

當調用該函數時,當前請求的session信息會所有清除,該用戶即便沒有登陸,使用該方法也不會報錯,接收一個HttpRequest對象,無返回值。

咱們在上面登陸成功以後會進入到index頁面,在index視圖裏寫個註銷的功能

def index(request): auth.logout(request) # 清除用戶的session數據
    return redirect('/login/')

login_requierd()

有些頁面咱們須要用戶登陸成功以後才能訪問,在以前咱們經過給設置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')

 is_authenticated()

用來判斷當前請求是否經過了認證,經過了返回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')

create_user()

建立新用戶的方法,必需要提供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)

create_superuser()

建立一個超級用戶,能夠登陸到後臺

語法和上面的同樣

from django.contrib.auth.models import User User.objects.create_superuser(email='',username=user, password=pwd)  # 有三個參數,email在這裏寫死了

check_password()

auth 提供的一個檢查密碼是否正確的方法,須要提供當前請求用戶的密碼。

密碼正確返回True,不然返回False。

 

user.check_password('密碼')

set_password()

auth 提供的一個修改密碼的方法,接收 要設置的新密碼做爲參數。

注意:要使用save()方法才能保存到數據庫裏面

from django.contrib.auth.models import User user.set_password(password='新密碼') user.save()

自定義auth_user表

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表了。

相關文章
相關標籤/搜索