Django之用戶認證auth模塊使用


Auth認證模塊

執行數據庫遷移的那兩條命令時,即使我們沒有建表,django是不是也會創建好多張表?我們創建之后去看一下里面的一個叫auth_user表,既然是表,那肯定應該有對應的操作改表的方法

auth_user表記錄的添加

  • 創建超級用戶(不可手動插入,因為密碼是加密的)

  • 簡單使用auth認證

    from django.contrib import auth
    def login(request):
      if request.method == 'POST':
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        user = auth.authenticate(request,username=name,password=pwd)
        # 類似於user=models.User.objects.filter(username=name,password=pwd).first()
        if user:
          return redirect('/home/')
      return render(request,'login.html')

     

  • 只是簡單的驗證信息不行,還需要給當前成功登陸的用戶保存登陸狀態,之前是通過cookie或者session,現在呢,auth也給你提供了一個比較好用的方法

    if user:
      # 等價於request.session['name']=name
      auth.login(request,user)  # 登陸,其實就把用戶信息放到session中,跑一下驗證session表

     

  • 上面的驗證和登陸其實不是它的亮點,亮點在於

    # 只要登陸成功執行了auth.login(request,user)
    # 之后在其他任意的視圖函數中都通過request.user獲取當前登陸用戶對象
    # 當沒有執行auth.login,request.user打印出來的是匿名用戶。將session表數據刪除即可演示改效果
    # 如何判斷request.user用戶是否通過auth.login登陸呢?request.user.is_auth
    # 為何執行auth.login之后,其他視圖函數中就可以通過request.user拿到當前登陸對象呢?想想django的中間件中有沒有一個叫Auth啥的中間件,它干了件什么事,能不能推導一下?取出session去表里面查相應的數據,然后放到request.user中,點進去看一下這個中間件確實如此

     

  • 注銷

    auth.logout(request)
    # 等價於刪除session數據request.session.flush()

     

  • 裝飾器校驗是否登陸及跳轉

    from django.contrib.auth.decorators import login_required
    ​
    @login_required(login_url='/login/',redirect_field_name='old')  # 沒登陸會跳轉到login頁面,並且后面會拼接上你上一次想訪問的頁面路徑/login/?next=/test/,可以通過參數修改next鍵名
    def my_view(request):
      pass

     

  • 如果我所有的視圖函數都需要裝飾並跳轉到login頁面,那么我需要寫好多份

    # 可以在配置文件中指定auth校驗登陸不合法統一跳轉到某個路徑
    LOGIN_URL = '/login/'  # 既可以局部配置,也可以全局配置

     

  • 回到最上面,我們是怎么對auth_user表添加數據的?命令行輸入~~~合理不?

    from django.contrib.auth.models import User
    def register(request):
      User.objects.create()  # 不能用這個,因為密碼是明文
      User.objects.createuser()  # 創建普通用戶
      User.objects.createsuperuser()  # 創建超級用戶

     

  • 校驗密碼,修改密碼

    request.user.check_password(pwd)  # 為什么不直接獲取查,因為前端用戶輸入的是明文數據庫密文
    ​
    request.user.set_password(pwd)
    request.user.save()  # 修改密碼

     

自定義模型表應用auth功能

如何擴張auth_user表?

  • 一對一關聯(不推薦)

    from django.contrib.auth.model import User
    ​
    class UserDetail(models.Models):
      phone = models.CharField(max_length=11)
      user = models.OnoToOneField(to=User)

     

  • 面向對象的繼承

    from django.contrib.auth.models import User,AbstractUser
    class UserInfo(AbstractUser):
      phone = models.CharField(max_length=32)
    ​

     


    # 需要在配置文件中,指定我不再使用默認的auth_user表而是使用我自己創建的Userinfo表
    AUTH_USER_MODEL = "app名.models里面對應的模型表名"


    """
    自定義認證系統默認使用的數據表之后,我們就可以像使用默認的auth_user表那樣使用我們的UserInfo表了。
    庫里面也沒有auth_user表了,原來auth表的操作方法,現在全部用自定義的表均可實現
    """


免責聲明!

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



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