41.django中auth用戶認證

Auth認證模塊

執行數據庫遷移的那兩條命令時,即便咱們沒有建表,django是否是也會建立好多張表?咱們建立以後去看一下里面的一個叫auth_user表,既然是表,那確定應該有對應的操做改表的方法前端

auth_user表記錄的添加python

  • 建立超級用戶(不可手動插入,由於密碼是加密的)數據庫

  • 簡單使用auth認證django

    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也給你提供了一個比較好用的方法cookie

    if user:
      # 等價於request.session['name']=name
      auth.login(request,user)  # 登錄,其實就把用戶信息放到session中,跑一下驗證session表
  • 上面的驗證和登錄其實不是它的亮點,亮點在於session

    # 只要登錄成功執行了auth.login(request,user)
    # 以後在其餘任意的視圖函數中都經過request.user獲取當前登錄用戶對象
    
    # 當沒有執行auth.login,request.user打印出來的是匿名用戶。將session表數據刪除便可演示改效果
    # 如何判斷request.user用戶是否經過auth.login登錄呢?request.user.is_authenticated
    
    # 爲什麼執行auth.login以後,其餘視圖函數中就能夠經過request.user拿到當前登錄對象呢?想一想django的中間件中有沒有一個叫Auth啥的中間件,它幹了件什麼事,能不能推導一下?取出session去表裏面查相應的數據,而後放到request.user中,點進去看一下這個中間件確實如此
  • 註銷app

    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頁面,那麼我須要寫好多份ui

    若用戶沒有登陸,則會跳轉到django默認的 登陸URL '/accounts/login/ ' 並傳遞當前訪問url的絕對路徑 (登錄成功後,會重定向到該路徑)。若是須要自定義登陸的URL,則須要在settings.py文件中經過LOGIN_URL進行修改。  LOGIN_URL = '/login/' # 這裏配置成你項目登陸頁面的路由
  • 回到最上面,咱們是怎麼對auth_user表添加數據的?命令行輸入~~~合理不?

    from django.contrib.auth.models import User
    def register(request):
      User.objects.create()  # 不能用這個,由於密碼是明文
      User.objects.create_user()  # 建立普通用戶
      User.objects.create_superuser()  # 建立超級用戶
  • 校驗密碼,修改密碼

    request.user.check_password(pwd)  # 爲何不直接獲取查,由於前端用戶輸入的是明文數據庫密文
    
    request.user.set_password(pwd)
    request.user.save()  # 修改密碼

自定義模型表應用auth功能

如何擴張auth_user表?

  • 一對一關聯(不推薦)

    from django.contrib.auth.model s 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表的操做方法,如今所有用自定義的表都可實現
    """

forms組件

-Django提供的用於數據校驗和模板渲染的組件
-在項目中建立一個py文件
    -1 寫一個類繼承Form
    -2 在類中寫屬性,寫的屬性,就是要校驗的字段
    -3 使用:生成一個你寫的類的對象myform,把要校驗的數據(字典),傳到對象中:MyForm(字典)
        -數據多?數據少?數據多能夠,少不行(required控制)
    -4 myform.is_valid() 是True表示全部字段都經過校驗
    -5 myform.cleaned_data:是一個字典,全部經過校驗的數據放在裏面
    -6 myform.errors:是一個字典,全部的錯誤字段的信息
-在模板中:
    -{{myform.name}}
    -{%for item in myform%}
        {{item.label}}:{{item}}
     {%endfor%}
    -myform.as_table/as_p/as_ul(不推薦使用)
相關文章
相關標籤/搜索