author認證模塊


author認證模塊

用auth模塊 你就用全套 不是自己寫一部分 用別人一部分

​ 創建超級管理員,用於登錄DJango admin的后台管理

​ 命令:createsuperuser,輸入順序用戶名》郵箱》密碼》確認密碼。

注意:所有密碼一定要設為為密文

登錄實例:

views.py

from django.shortcuts import render

# Create your views here.
from django.contrib import auth
from django.contrib.auth.models import  User

def login(request):
  if request.method == 'POST':
    username = request.POST.get('username')
    password = request.POST.get('password')
    user_obj = auth.authenticate(username=username,password=password)      
    if user_obj:
      print(user_obj)
      print(user_obj.username)
      print(user_obj.password)
      auth.login(request,user_obj) # 執行完這一句只要能夠拿到request的地方都可以通過request.user獲取當前登錄用戶對象
      """該方法會主動幫你操作session表 並且只要執行了該方法
         你就可以在任何位置通過request.user獲取到當前登錄的用戶對象
      """
      return render(request,'login.html')

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>

</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
</body>
</html>

該方法會有一個返回值 當條件存在的情況下 返回就是數據對象本身條件不滿足 直接返回None

,返回密碼為密文

pbkdf2_sha256$36000$BcE7QVE95n4A$55xwX93B60dEIqKJcXd24+VoEVY4d0CtaTPkwmSDMhc=。

變化:

驗證auth.login(request,user_obj)

為了方便,節省代碼量。我們需要使用全局配置,在settings:

# auth校驗用戶是否登錄 全局配置跳轉url
LOGIN_URL = '/login/'

效果可以刪除django_session中的數據,重新登錄

修改密碼:

views.py

# 繼承上邊代碼
from django.contrib.auth.decorators import login_required
@login_required
def set_password(request):
    if request.method == 'POST':
        old_password = request.POST.get('old_password')
        new_password = request.POST.get('new_password')
        # 校驗原密碼對不對
        is_right = request.user.check_password(old_password)
        print(is_right)
        if is_right:
            # 修改密碼
            request.user.set_password(new_password)  # 僅僅只會在內存中產生一個緩存 並不會直接修改數據庫
            request.user.save()  # 一定要點save方法保存 才能真正的操作數據庫
            return redirect('/login/')
    return render(request,'set_password.html',locals())

set_password.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>username<input type="text" disabled value="{{ request.user.username }}"></p>
    <p><input type="text" name="old_password"></p>
    <p><input type="text" name="new_password"></p>
    <input type="submit">
</form>
</body>
</html>

注冊功能演示:

views.py

def register(request):
  if request.method == 'POST':
    username = request.POST.get('username')
    password = request.POST.get('password')
    # models.User.objects.create(username=username,password=password)
    # User.objects.create(username=username,password=password)  # 不用使用create 密碼會直接存成明文
    # User.objects.create_user(username=username,password=password)  # 創建普通用戶
    User.objects.create_superuser(username=username,password=password,email='123@qq.com')  # 創建超級用戶  郵箱字段必須填寫
    #
    return render(request,'register.html')

register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>

</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
</body>
</html>

擴展auth_user字段

  1. 利用一對一表關系,擴展字段

  2. 自己寫一個默寫類,繼承原來的auth_user類,然后在settings配置文中告訴Django使用新建的類代替原來的auth_user 表,因為已經創建完模型庫,所以只能換庫或者換項目。

    這里更換成MySQL數據庫

    建表:

    models.py

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    # Create your models here.
    
    class Userinfo(AbstractUser):
        """
        強調 你繼承了AbstractUser之后 你自定義的表中 字段不能跟原有的沖突
        """
        phone = models.BigIntegerField()
        avatar = models.FileField()
        register_time = models.DateField(auto_now_add=True)
    

一定要在settings 中指定

# auth自定義表配置
AUTH_USER_MODEL = 'app01.Userinfo'

# 固定語法: AUTH_USER_MODEL = '應用名.表名'

通過上邊的方式繼承的表,還是可以繼續使用auth模塊所有的功能

基於中間件 參考源碼 設計自己的功能可插拔式設計

總結:類似於Django中的settings文件,舍棄大量的局部配置文件,該用全局配置文件。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM