天天看點

Django——auth

一、auth元件介紹

可以實作包括使用者注冊、使用者登入、使用者認證、登出、修改密碼等功能,内置了強大的使用者認證系統--auth,它其實就是一個app      

二、内置屬性方法

注意:在用屬性方法前,必須進行資料庫遷移,兩條指令

1. authenticate使用者認證  

settings.py  基本路徑配置好

urls.py注意每次配好路由

login.html 

ps : {% csrf_token %} 用上它不用注釋csrf那個中間件了      
<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>登入title>head><body><form action="" method="post">
    {% csrf_token %} 
    <p>使用者名:<input type="text" name="name">p>
    <p>密碼:<input type="password" name="password">p>
    <p><input type="submit" value="送出">p>form>body>html>      

views.py

from django.shortcuts import render, HttpResponse, redirect#from django.contrib.auth.models import Userfrom django.contrib import authdef login(request):    if request.method=='GET':        return render(request,'login.html')    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 方案行不通,密碼是密文的,永遠比對不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案,有兩個注意點
        ## 第一個參數必須是request對象
        ##必須用username和password不能用其他名,看源碼
        user=auth.authenticate(request,username=name,password=password)        if user:            return HttpResponse('登入成功')        else:            return HttpResponse('使用者名或密碼錯誤')      

2.login

# 調用auth後,表示使用者登入了# 1 存了session# 2 以後所有的視圖函數,都可以使用request.user,它就是目前登入使用者auth.login(request,user)      

代碼:

urls.py略

order.html   這裡隻是測試下

<body>{{ request.user.username }}的訂單頁面,買了好多東西body>      

index.html

<body>{{ request.user.username }}登入了body>      
from django.shortcuts import render, HttpResponse, redirectfrom django.contrib.auth.models import User# 不管是否登入,都能通路      
def index(request):
    return render(request, 'index.html')      
def order(request):
   print(request.user)    return render(request, 'order.html')##  使用者登入成功後存sessionfrom django.contrib import authdef login(request):    if request.method=='GET':        return render(request,'login.html')    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 此方案行不通,密碼是密文的,永遠比對不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案
        ## 第一個參數必須是request對象
        ##username和password
        user=auth.authenticate(request,username=name,password=password)        if user:            # 調用auth,表示使用者登入了
            # 1 存了session
            # 2 以後所有的視圖函數,都可以使用request.user            auth.login(request,user)
       return HttpResponse('登入成功')        else:            return HttpResponse('使用者名或密碼錯誤')      

3.logout

def logout(request):    # 後續再通路視圖函數,就沒有目前登入使用者了request.user(匿名使用者AnonymousUser)    auth.logout(request)    return redirect('/index/')      

oeder.html

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>訂單頁面title>head><body>{{ request.user.username }}的訂單頁面,買了好多東西<br><hr><a href="/logout/">點我退出a>body>html>      

4.is_authenticated

# is_authenticated 傳回True或者False,判斷使用者是否登入# 用在視圖中views.pyif request.user.is_authenticated:    print('使用者登入了')else:    print('使用者沒有登入,匿名使用者')# 用在模闆中index.html{% if request.user.is_authenticated %}
{{ request.user.username }} 登入了
    {% else %}    <a href="/login/">滾去登入{% endif %}      

5.login_requierd

1 它是個裝飾器, 裝飾在視圖函數上,隻要沒有登入,就進不來# 必須登入後才能通路@login_required(login_url='/login/')  #意思是如果沒有登入就重定向到/login/      
from django.shortcuts import render, HttpResponse, redirectfrom django.contrib import authfrom django.contrib.auth.decorators import login_requireddef login(request):    if request.method=='GET':        return render(request,'login.html')    else:
        name=request.POST.get('name')
        password=request.POST.get('password') # 明文
        ## 方案行不通,密碼是密文的,永遠比對不成功
        # user=User.objects.filter(username=name,password=password)
        ## 使用此方案
        ## 第一個參數必須是request對象
        ##username和password
        user=auth.authenticate(request,username=name,password=password)        if user:            # 調用auth,表示使用者登入了
            # 1 存了session
            # 2 以後所有的視圖函數,都可以使用request.user            auth.login(request,user)
            url=request.GET.get('next')            if url:                return redirect(url)            else:                return redirect('/index/')        else:            return HttpResponse('使用者名或密碼錯誤')# 必須登入後才能通路@login_required(login_url='/login/')def order(request):    print(request.user)  # 如何實作的?
    print(request.user.username)  # AnonymousUser

    if request.user.is_authenticated:        print('使用者登入了')    else:        print('使用者沒有登入,匿名使用者')    return render(request, 'order.html')      

6.create_user

# 使用内置的create_user或者create_superuser方法 superuser權限跟user不同user=User.objects.create_user(username=name,password=password)# user=User.objects.create_superuser(username=name,password=password)      
from django.contrib.auth.models import Userdef register(request):    if request.method == 'GET':        return render(request, 'register.html')    else:
        name = request.POST.get('name')
        password = request.POST.get('password')        # 注冊使用者(有問題,密碼是明文)
        # user=User.objects.create(username=name,password=password)
        # print(user)

        # 使用内置的create_user或者create_superuser方法
        user = User.objects.create_user(username=name, password=password)        # user=User.objects.create_superuser(username=name,password=password)
        return redirect('/login/')      

register.html

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>注冊title>head><body><form action="" method="post">
    {% csrf_token %}    <p>使用者名:<input type="text" name="name">p>
    <p>密碼:<input type="password" name="password">p>
    <p>确認密碼:<input type="password" name="re_password">p>
    <p><input type="submit" value="送出">p>form>body>html>      

7.check_password 校驗密碼

## 有了使用者,校驗密碼是否正确# 先擷取到使用者對象user = User.objects.filter(username=name).first()# 判斷密碼是否正确flag=user.check_password(password)      
def login(request):    if request.method == 'GET':        return render(request, 'login.html')    else:
        name = request.POST.get('name')
        password = request.POST.get('password')  # 明文
        # 先擷取到使用者對象
        user = User.objects.filter(username=name).first()        # 判斷密碼是否正确
        flag = user.check_password(password)    
        if flag:
            auth.login(request, user)
            url = request.GET.get('next')            if url:                return redirect(url)            else:                return redirect('/index/')        else:            return HttpResponse('使用者名或密碼錯誤')      

8.set_password 修改密碼

from django.contrib.auth.models import User      
def change_password(request):    if request.method == 'GET':        return render(request, 'change_pwd.html')    else:
        old_pwd = request.POST.get('old_pwd')
        new_pwd = request.POST.get('new_pwd')
        re_new_pwd = request.POST.get('re_new_pwd')#注意要核驗,不然出bug
        if request.user.check_password(old_pwd):            # 密碼正确再修改            request.user.set_password(new_pwd)            # 一定要記住儲存(****)            request.user.save()            return redirect('/login/')        else:            return HttpResponse('原來密碼錯誤')      
<body>{% if request.user.is_authenticated %}
    {{ request.user.username }} 登入了    <br>
    <a href="/change_pwd/">修改密碼a>{% else %}    <a href="/login/">滾去登入a>{% endif %}body>      
<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>修改密碼title>head><body><form action="" method="post">
        {% csrf_token %}    <p>原密碼:<input type="password" name="old_pwd">p>
    <p>新密碼:<input type="password" name="new_pwd">p>
    <p>确認密碼:<input type="password" name="re_new_pwd">p>
    <p><input type="submit" value="送出">p>form>body>html>