Django-用戶認證組件

from django.contrib import auth
from django.contrib.auth.models import User   (User表)

一:auth模塊

1:auth相關表-用戶認證的前提

Django 在認證組件裏自帶一個關於auth的表auth_user。css

使用命令插入數據(交互式):python manage.py createsuperuserhtml

 2:用法

1 、authenticate()   :驗證用戶輸入的用戶名和密碼是否相同

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

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

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

 

2 、login(HttpRequest, user):登陸  

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

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

 

3 、logout(request)  註銷用戶 

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

  
    # 1:request.COOKIE.get("sessionid)   #取cookie中的值
    # 2:在Django - session表過濾session - key的記錄並與刪除這條記錄
    # 3:刪除cookie,response.delete_cookie("sessionid")
session:
    request.session.flush()   #至關於上面3個步驟

  '''
auth模塊:
    auth.logout(request)  #至關於上面的那個步驟

 

4 、user對象

4.1 is_authenticated()

若是是真正的 User 對象,返回值恆爲 True 。 用於檢查用戶是否已經經過了認證。
經過認證並不意味着用戶擁有任何權限,甚至也不檢查該用戶是否處於激活狀態,這只是代表用戶成功的經過了認證。 這個方法很重要, 在後臺用request.user.is_authenticated()判斷用戶是否已經登陸,若是true則能夠向前臺展現request.user.namebootstrap

 

 

要求:後端

 

1  用戶登錄後才能訪問某些頁面,bash

 

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

 

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

 

方法1:

 

 

def my_view(request):
  if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

 

方法2:

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的絕對路徑 (登錄成功後,會重定向到該路徑)。  

  

4.2 、建立用戶:create_user 

(咱們以前插入用戶對象是經過命令行,但在代碼中咱們怎麼插入呢)

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='',email='')

4.3 、check_password(passwd):密碼檢查

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

4.4 、修改密碼: set_password() 

user = User.objects.get(username='')#拿到用戶對象
user.set_password(password='')
user.save 

 

 

二:案例:

前提:python manage.py createsuperuser  往auth_user裏添加些數據

1:登錄認證

項目--圖書管理系統--第五階段--加入cookie和session功能 基礎上

url.py

    path('log/', views.log,name='log'), #auth登錄
  path('index_user/', views.index_user,name='index_user'),#auth

views.py

from django.contrib import auth

def log(request):

    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        # 獲取用戶名和密碼
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        # 數據庫查詢用戶是否存在
        # authenticate去auth_user查尋記錄,查詢成功返回用戶對象,失敗返回None
        user_obj=auth.authenticate(username=user,password=pwd)

        if user_obj:
            # 保存用戶狀態信息session,保存好後request.user(全局變量)就是當前登錄對象
            auth.login(request,user_obj)  #記錄user_obj的相關信息;request.session["user"]=user_obj.pk===>request.user:當前登錄用戶對象,默認是anonymousUser
            '''
            print(request.user)#當前用戶默認匿名用戶anonymousUser
            print(request.user.id)
            print(request.user.username) #True是不是活動用戶
            '''else:
            return redirect(reverse('login'))


def index_user(request):
if request.user.id :#或者使用request.user.is_authenticated ===> True/False
        #進入到圖書管理界面,分頁
book_list = Book.objects.all()
paginator = Paginator(book_list, 5)
try: #若是取超過頁碼的頁面會報錯
current_page_num=request.GET.get('page',1) #若是取不到數據,就取第一頁的#取值page是多少
current_page=paginator.page(current_page_num)#顯示第幾頁數據
except EmptyPage as e:
current_page_num=1
current_page = paginator.page(1)
return render(request, 'index.html', {'current_page': current_page,'paginator':paginator,'current_page_num':int(current_page_num)})
else:
return redirect(reverse('login'))

def logout(request):
  '''
# 1:request.COOKIE.get("sessionid) #取cookie中的值
# 2:在Django - session表過濾session - key的記錄並與刪除這條記錄
# 3:刪除cookie,response.delete_cookie("sessionid")
request.session.flush() #至關於上面3個步驟
  '''
auth.logout(request) #至關於上面的那個步驟
return redirect(reverse('log'))

 2:註冊

(1)前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圖書管理系統登錄</title>
</head>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .aa{
            margin: 0 auto;
            margin-top: 100px;
            height: 120px;
            width: 200px;
            background-color: #4cae4c;
        }
        input{
            display: block;
        }
        .right{
            float: right;
        }
        .left{
            float: left;
        }
    </style>
<body>
    <div class="aa">
        <form action="" method="post">
            {% csrf_token %}
            用戶名<input type="text" name="user">
            密 碼<input type="text" name="pwd">
            <input class="right" type="submit" value="註冊">
        </form>
    </div>

</body>
</html>
reg.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圖書管理系統登錄</title>
</head>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .aa{
            margin: 0 auto;
            margin-top: 100px;
            height: 120px;
            width: 200px;
            background-color: #4cae4c;
        }
        input{
            display: block;
        }
        .right{
            float: right;
        }
        .left{
            float: left;
        }
    </style>
<body>
    <div class="aa">
        <form action="" method="post">
            {% csrf_token %}
            用戶名<input type="text" name="user">
            密 碼<input type="text" name="pwd">
            <input class="right" type="submit" value="註冊">
        </form>
    </div>

</body>
</html>
login.html

 

(2)後端

urls.py

path('reg/', views.reg,name='reg'), #auth註冊

 

views.py

def reg(request):
    if request.method=='GET':

        return render(request,'reg.html')
    else:
        user=request.POST.get('user')
        pwd=request.POST.get('pwd')

        from django.contrib.auth.models import User
        # User.objects.create_superuser()   #建立超級用戶
        User.objects.create_user(username=user,password=pwd)          #建立普通用戶
        return redirect(reverse('log'))

 

3:修改密碼

(1)前端頁面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圖書管理系統</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .header {
            width: 100%;
            height: 50px;
            background-color: #369;
        }
        .logout{
            display:block;
            float: right;
            margin-right: 50px;
            margin-top: 15px;
        }
        .h{
            margin-left: 46%;
            margin-top: 10px;
            float: left;
            font-size: 20px;
            color: yellow;
        }
    </style>
</head>
<body>
<div class="header">
    <div>
        <p class="h">圖書管理系統</p>
        <form action="/logout/">
            <input class="logout"name="logout" type="submit"value="註銷">
        </form>
        <form action="/set_password/"method="get">
            <input class="logout"name="logout" type="submit"value="修改密碼">

        </form>
    </div>
</div>
<div class="container">
    <div class="row">
        <div class="col-md-2 ">
            <div class="panel panel-default">
                <div class="panel-heading"><div class="btn ">功能系統</div></div>
                <div class="panel-body">
                    <div class="btn "><a href="{% url 'books' %}">圖書管理系統</a></div>
                    <div class="btn"><a href="#">做者管理系統</a></div>
                    <div class="btn"><a href="#">出版社管理系統</a></div>
                </div>
            </div>

        </div>

        <div class="col-md-10" style="padding-top: 20px">
            {% block content %}

            {% endblock %}
        </div>
    </div>
</div>
</body>
</html>
base.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圖書管理系統登錄</title>
</head>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .aa{
            margin: 0 auto;
            margin-top: 100px;
            height: 120px;
            width: 200px;
            background-color: #4cae4c;
        }
        input{
            display: block;
        }
        .right{
            float: right;
        }
        .left{
            float: left;
        }
    </style>
<body>
    <div class="aa">
        <form action="" method="post">
            {% csrf_token %}
            用戶名<input type="text" name="user"placeholder="{{ reqest.user.username }}">
            密 碼<input type="text" name="pwd">
            <input class="right" type="submit" value="修改密碼">
        </form>
    </div>

</body>
</html>
set_password

 

(2)後端

urls.py

path('set_password/', views.set_password,name='set_password'), #auth修改密碼

 

views.py

def set_password(request):
    if request.method=='GET':
        return render(request,'set_password.html')
    else:
        # user=request.POST.get('user')
        pwd=request.POST.get('pwd')

 user = User.objects.get(username=request.user.username) user.set_password(raw_password=pwd) user.save() return redirect(reverse('log'))
相關文章
相關標籤/搜索