[Django高級之Auth模塊]

[Django高級之Auth模塊]

auth模塊 ←詳情點擊查看

1、Auth模塊是什麼

Auth模塊是Django自帶的用戶認證模塊:

我們在開發一個網站的時候,無可避免的需要設計實現網站的用戶系統。此時我們需要實現包括用戶註冊、用戶登錄、用戶認證、註銷、修改密碼等功能,這還真是個麻煩的事情呢。

Django作為一個完美主義者的終極框架,當然也會想到用戶的這些痛點。它內置了強大的用戶認證系統–auth,它默認使用 auth_user 表來存儲用戶數據。

1 django提供的用戶認證,創建,修改密碼。。。用戶相關操作
2 不需要創建用戶表了,默認帶了
3 插入數據(創建用戶):
    python3 manage.py createsuperuser   # 創建超級用戶  通常只有一到兩個超級用戶

2、auth模塊常用方法

from django.contrib import auth   # 導入auth模塊

urls.py

from app01 import views


urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/',views.MyLogin.as_view()),  # 登錄界面
    url(r'^aa/',views.aa,name='aa'),  
    url(r'^set_password/',views.set_password,)  # 修改密碼
]

views.py

from django.contrib import auth   # 導入auth模塊

def login(request):
    
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # 返回一個對象 即驗證用戶名以及密碼是否正確,一般需要username 、password兩個關鍵字參數。request不是必填參數
        user_obj = auth.authenticate(request,username=username,password=password)
        # print(user_obj)
        # print(user_obj.username)
        # print(user_obj.password)
        
        if user_obj:	# 返回值有可能為假 所以需要判斷是否為真
            auth.login(request,user_obj)   # 為真的話 保存用戶狀態 用auth.login()方法
            
            '''只要執行了login方法、那麼在任意位置都可以通過request.user獲取當前對象'''

    return render(request,'login.html',locals())



def aa(request):
    '''只要執行了login方法、那麼在任意位置都可以通過request.user獲取當前對象'''
    
    print(request.user) # 獲取用戶對象 如果沒有登錄就是匿名用戶
    # print(request.user.username)
    # print(request.user.password)
    print(request.user.is_authenticated())  # 判斷用戶是否登錄
    return HttpResponse('哈哈')



# 修改密碼 
# 驗證是否登錄裝飾器 導入模塊↓
from django.contrib.auth.decorators import login_required

# @login_required(login_url='dl')  # 驗證是否登錄裝飾器
@login_required    #  全局驗證是否登錄裝飾器
def set_password(request):
    
    old_password = request.POST.get('old_password')  # 老密碼
    new_password = request.POST.get('new_password')  # 新密碼
    
    # 校驗原密碼是否相同 得到一個返回時 True or false
    # 用 request.user.check_password(老密碼) 可以 自動校驗
    is_right = request.user.check_password(old_password)
    # print(is_right)
    
    if is_right:  
        
        # 修改新密碼  使用 request.user.set_password(新密碼)方法
        request.user.set_password(new_password)
        
        # 一定要保存 不保存 修改無效
        request.user.save()
    return render(request,'set_password.html',locals())

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="//cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="//cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link href="//cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<h1>用戶登錄</h1>
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>

    <button>提交</button>

</form>

</body>
</html>

set_password.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="//cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
    <script src="//cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <link href="//cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>

<h1>密碼修改</h1>

<form action="" method="post">
    {% csrf_token %}  
    
    <p>username:<input type="text" name="username" value="{{ request.user.username }}" disabled></p>
        
    <p>old_password:<input type="text" name="old_password"></p>  # 輸入老密碼
        
    <p>new_password:<input type="text" name="new_password"></p>  # 輸入新密碼
        
    <input type="submit">

 
</form>

</body>
</html>

總結操作:

from django.contrib import auth

# 校驗用戶名密碼是否正確
auth.authenticate(request,username=username,password=password)

# 保存用戶狀態
auth.login(request,user_obj)

# 查看用戶是否登錄
request.user.is_authenticated()

# 獲取用戶對象
request.user

# 校驗原密碼是否正確
request.user.check_password()

# 修改密碼 
request.user.set_password()
request.user.save()


# 校驗是否登錄裝飾器
from django.contrib.auth.decorators import login_required
"""
跳轉全局配置
	只需在settings配置文件下寫入
	LOGIN_URL = '/lg/'
	直接在你想要裝飾的對象上寫入@login_required即可
	
跳轉局部配置
	@login_required(login_url='/lg/')
"""