Django 學習之用戶認證組件auth與User對象

.auth模塊

from django.contrib import authhtml

django.contrib.auth中提供了許多方法,這裏主要介紹其中的三個。ajax

1 .authenticate()   

驗證用戶輸入的用戶名和密碼是否相同算法

提供了用戶認證,即驗證用戶名以及密碼是否正確,通常須要username  password兩個關鍵字參數數據庫

若是認證信息有效,會返回一個  User  對象。authenticate()會在User 對象上設置一個屬性標識那種認證後端認證了該用戶,且該信息在後面的登陸過程當中是須要的。當咱們試圖登錄一個從數據庫中直接取出來不通過authenticate()User對象會報錯的django

user = authenticate(username='someone',password='somepassword')後端

2 .login(HttpRequest, user):登陸  

該函數接受一個HttpRequest對象,以及一個認證了的User對象cookie

此函數使用djangosession框架給某個已認證的用戶附加上session id等信息。session

# 登陸例子的視圖函數:框架

from django.contrib.auth import authenticate, login函數

 

def login(request):

    # 經過auth組件實現

    if request.method == "GET":

        return render(request, "login.html")

    elif request.method == "POST":

        username = request.POST.get("username")

        password = request.POST.get("pwd")

        valid_num = request.POST.get("valid_num")

        # 驗證填寫驗證碼的正確性

        keep_str = request.session.get("keep_str")

        if keep_str.upper() == valid_num.upper():

            user = auth.authenticate(username=username, password=password)  

# 驗證用戶名和密碼

            if user:

                # 若是認證成功,就讓登陸,這個login裏面包括了session操做和cookie

                auth.login(request, user)

                return redirect("/index/")

            else:

                return render(request, "login.html", {"error": "有錯誤"})

        else:

            return render(request, "login.html", {"error": "驗證碼輸入錯誤"})

    else:

        return render(request, "login.html", {"error": "有錯誤"})

3.logout(request)  註銷用戶 

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

from django.contrib.auth import logout

   

# 退出登陸

def logout(request):

    logout(request)

    # request.session.flush()    #session方法退出,步驟一

    rep = redirect("/login/")    # 退出返回登陸頁面

    # rep.delete_cookie("is_login") # session方法退出,步驟二

    return rep

 

.User對象

User 對象屬性:usernamepassword(必填項)password用哈希算法保存到數據庫

is_staff : 用戶是否擁有網站的管理權限.

is_active : 是否容許用戶登陸, 設置爲``False``,能夠不用刪除用戶來禁止 用戶登陸

1.建立用戶:create_user

使用 create_user 輔助函數建立用戶分三種建立方式:

(1)create:

建立一個普通用戶,密碼是明文的.(通常不推薦使用,由於沒法結合auth組件的使用)

(2) create_user:

建立一個普通用戶,密碼是密文的.

(3)create_superuser:

建立一個超級用戶,密碼是密文的,要多傳一個email參數.

 

例:下面用上面上中方式建立了三個用戶和設置密碼

而後對數據庫中的auth_user 進行查詢:

經過如上數據能夠得出:

方式一:密碼爲明文,方式二:密碼爲密文,方式三:密碼爲密文,並且須要填寫郵箱,並且在是否爲super用戶字段處的值爲:1

2.check_password(passwd) 密碼檢查

用戶須要修改密碼的時候 首先要讓他輸入原來的密碼 ,若是給定的字符串經過了密碼檢查,返回 True

3.set_password()  修改密碼

from django.contrib.auth.models import User

 

user = User.objects.get(username='')

user.set_password(password='')

user.save 

4.user對象的 is_authenticated()

要求:

(1)用戶登陸後才能訪問某些頁面

(2)若是用戶沒有登陸就訪問該頁面的話直接跳轉登陸頁面

(3)用戶在跳轉的登陸界面中完成登陸後,自動訪問跳轉到以前訪問的地址

注意:下面兩個方法是用於到登陸頁以前的網頁的判斷。

方法一:本身寫的裝飾器

# 本身寫的裝飾器

def login_required(func):

    def inner(request, *args, **kwargs):

        if not request.user.is_authenticated:  # 沒有登陸成功

            path = request.path

            return redirect('/login/?next=%s' % path)

        ret = func(request, *args, **kwargs)

        return ret

    return inner

方法二:django已經爲咱們設計好了一個用於此種狀況的裝飾器:login_requierd()

from django.contrib.auth.decorators import login_required

      

@login_required

def my_view(request):

  ...

 

若用戶沒有登陸,則會跳轉到django默認的 登陸URL '/accounts/login/ ' (這個值能夠在settings文件中經過LOGIN_URL進行修改)。並傳遞  當前訪問url的絕對路徑 (登錄成功後,會重定向到該路徑)

 

三.簡單的例子

1.登陸驗證

# 登陸函數

def login(request):

    # 經過auth組件實現

    if request.method == "GET":

        return render(request, "login.html")

    elif request.method == "POST":

        username = request.POST.get("username")

        password = request.POST.get("pwd")

        valid_num = request.POST.get("valid_num")

        # 驗證填寫驗證碼的正確性

        keep_str = request.session.get("keep_str")

        if keep_str.upper() == valid_num.upper():

            user = auth.authenticate(username=username, password=password)  # 驗證用戶名和密碼

            if user:

                # if not request.user.is_authenticated():

                # 若是認證成功,就讓登陸,這個login裏面包括了session操做和cookie

                auth.login(request, user)

                # 路徑爲上一個路徑或者返回一個主頁,這裏的book_list能夠爲主頁的路徑通常名爲:index

                path = request.GET.get("next") or "/book_list/"

                return redirect(path)

            else:

                return render(request, "login.html", {"error": "有錯誤"})

        else:

            return render(request, "login.html", {"error": "驗證碼輸入錯誤"})

    else:

        return render(request, "login.html", {"error": "有錯誤"})

 

2.註冊驗證

from django.contrib.auth.models import User

# 註冊及驗證

def register(request):

    if request.method == "GET":

        form = UserInfoForm()  # 初始化form對象

        return render(request, "register.html", {"form": form})

    if request.is_ajax():

        ret = {"status": 1, "msg": None}

        print(request.POST)

        form = UserInfoForm(request.POST)

        if form.is_valid():

            print(form.cleaned_data)

            data = form.cleaned_data  # 效驗經過的數據,是字典的類型數據

# 須要刪除字典中驗證密碼,不須要保存到數據庫中

            data.pop("cf_password")

            User.objects.create_user(**data)  # User是以個對象

            print(data)

        else:

            print(form.errors)

            ret['status'] = 0

            ret['msg'] = form.errors

        return JsonResponse(ret)

3.修改密碼驗證

 

# 修改密碼

@login_required    #內置驗證是不是登陸狀態的裝飾器

def change_pwd(request):

    if request.method == "POST":

        oldpassword = request.POST.get("oldpassword", "")

        newpassword = request.POST.get("newpassword", "")

        # 獲得當前登陸的用戶,判斷舊密碼是否是和當前的密碼同樣

        username = request.user  # 打印的是當前登陸的用戶名

        user = User.objects.get(username=username)  # 查看用戶

        print(user)

        ret = user.check_password(oldpassword)  # 檢查密碼是否正確

        print(ret)

        if ret:

            user.set_password(newpassword)  # 若是正確就給設置一個新密碼

            user.save()  # 保存

            return redirect("/login/")

        else:

            info = "輸入密碼有誤"

            return render(request, "change_pwd.html", {"info": info})

    return render(request, "change_pwd.html")

 

4.退出

from django.contrib.auth import logout

# 退出登陸

def logout_user(request):

    logout(request)

    rep = redirect("/login/")

    return rep

相關文章
相關標籤/搜索