1. 程式人生 > 實用技巧 >django修身大法之歸天心法

django修身大法之歸天心法

使用者認證系統

⼀、概要

auth模組是Django提供的標準許可權管理系統,可以提供使用者身份認證, 使用者組和權
限管理。

auth可以和admin模組配合使用, 快速建立網站的管理系統。

在INSTALLED_APPS中新增'django.contrib.auth'使用該APP, auth模組預設啟用。

主要的操作包括:

  1. create_user 建立使用者
  2. authenticate 驗證登入
  3. login 記住使用者的登入狀態
  4. logout 退出登入
  5. is_authenticated 判斷使用者是否登入
  6. @login_required 判斷使用者是否登入的裝飾器

⼆、前期配置

1、說明

Django 在新建工程時已經為使用使用者認證系統做好了全部必要的配置。不過有可
能你並非使用 django-admin 命令新建的工程,或者你使用的是⼀個正在開發中的
項⽬,因此最好再檢查⼀下 settings.py ⽂件中是否已經做好了全部必要配置。

2、配置

  1. 在setting.py的INSTALLED_APPS
INSTALLED_APPS = [ 
'django.contrib.auth',  
# ⽤戶許可權處理部分依賴的應⽤
'django.contrib.contenttypes',
]
  1. 在setting.py的MIDDLEWARE
MIDDLEWARE = [
# 會話⽀持中介軟體
'django.contrib.sessions.middleware.SessionMiddleware',
# 認證⽀持中介軟體
'django.contrib.auth.middleware.AuthenticationMiddleware',
]

三、User物件

1、user物件

  1. 屬性
欄位 說明 備註
username 少於等於30個字元。 使用者名稱可以包含字母數字、_、@、+、.和- 字元
password 密碼的雜湊及元資料。(Django 不儲存原始
密碼)。原始密碼可以無限長而且可以包含
任意字元。參見密碼相關的⽂檔

is_active 布林值。指示使用者的賬號是否啟用,預設值
為True

first_name 少於等於30個字元
last_name 少於30個字元
email 郵箱地址
groups 與Group 之間的多對多關係
user_permissions 與Permission 之間的多對多關係
is_staff 布林值。指示使用者是否可以訪問Admin 站點
is_superuser 布林值。只是這個⽤戶擁有所有的許可權而不
需要給他們分配明確的許可權。

last_login 使用者最後⼀次登入的時間

date_joined 賬戶建立的時間。當賬號建立時,預設設定
為當前的date/time


  1. 說明

    User 物件屬性:username, password(必填項)password用雜湊演算法保
    存到資料庫

    is_staff : 使用者是否擁有網站的管理許可權.

    is_active : 是否允許使用者登入, 設定為 False ,可以不用刪除使用者來禁止使用者
    登入

2、拓展 User 模型

2.1、說明

使用者可能還包含有頭像、暱稱、介紹等等其它屬性,因此僅僅使用 Django 內
置的 User 模型是不夠。所有有些時候我們必須使用在系統的User上進行拓展

2.2、繼承AbstractUser

  1. 說明

    推薦方式、django.contrib.auth.models.User 也是繼承自 AbstractUser 抽
    象基類,而且僅僅就是繼承了 AbstractUser ,沒有對 AbstractUser 做任何
    的拓展

  2. 在app的models.py中

    class User(AbstractUser): 
        phone = models.CharField(
        max_length=12,
        null=True,
        verbose_name="⼿機號"
         )
        class Meta(AbstractUser.Meta):
            db_table='user
    
  3. 注意

    為了讓 Django 使用者認證系統使用我們自定義的使用者模型,必須在 settings.py
    裡通過 AUTH_USER_MODEL 指定自定義使用者模型所在的位置

    AUTH_USER_MODEL = 'app名字.User'
    
  4. 遷移

    python manage.py makemigrations
    python manage.py migrate
    

3、常用操作

1、驗證登入

  1. 說明

    當用戶登入的時候用 **authenticate(username=username,password=password) **驗
    證使用者是否登入,如果資料庫中存在使用者輸⼊的賬號和密碼,返回⼀個user對
    象,否則返回None。底層將password用hash演算法加密後和資料庫中
    password進行對比

  2. 示例程式碼

    def myauthenticate(request):
         pwd = request.POST.get("pwd", "")
         u_name = request.POST.get("u_name", "")
         if len(pwd) <= 0 or len(u_name) <= 0:
             return HttpResponse("賬號或密碼不能為空")
         else: 
            user = authenticate(username=u_name, password=pwd) 
            if user:
                return HttpResponse("驗證成功")
            else:
                return HttpResponse("賬號或密碼錯誤")
    

2、註冊操作

  1. 說明

    當用戶註冊的時候用**create_user(username,password,email) **預設情況
    下 is_active=True,is_staff=False,is_superuser=False 。
    底層將password用hash演算法加密之後儲存到資料庫中

  2. 示例程式碼

    def register_view(request):
    	if request.method == 'POST': 
            try: 
    			username = request.POST.get('username')
                password = request.POST.get('password')
    			phone = request.POST.get('phone')
    			email = request.POST.get('email')
    			# 驗證⽤戶是否存在
    			user = User.objects.filter(username=username).first()
    			if user: 
                    # ⽤戶已經存在
                    return render(request, 'register.html', {'msg':
                    '⽤戶名已存在'})
    			else: 
                    # 儲存⽤戶
                    User.objects.create_user(username=username,
    
                    password=password,
    
                    phone=phone,
                    email=email)
    
                    return redirect(reverse("App:login"))
    
             except Exception as e:
               return render(request, 'register.html', {'msg': '註冊失敗'})   
          else:
               return render(request, 'register.html')
    
    

3、登入操作

  1. 說明

    當用戶登入的時候用 login(request,user) 來記住使用者的登入狀態
    該函式接受⼀個HttpRequest物件,以及⼀個認證了的User物件
    此函式使用django的session框架給某個已認證的使用者附加上session id等信
    息。

  2. 示例程式碼

    def login_view(request):
    	if request.method == 'POST': 
            username = request.POST.get('username') 
            password = request.POST.get('password')
    
            # 驗證⽤戶是否存在
    
            user = authenticate(request, username=username,
            password=password)
    
            if user:
                login(request,user)
    			return redirect('/') 
    		else: 
                return render(request, 'test/login.html', {'msg': '⽤
                戶密碼錯誤'})
    
        else:
    
            return render(request, 'login.html')
    

4、登出操作

  1. 說明

當用戶登出的時候用 logout(request) ,只需要⼀個引數request

  1. 示例程式碼

    from django.contrib.auth import logout
    
    def logout_view(request):
        logout(request)
    

5、修改密碼

  1. 說明

  2. 示例程式碼

    user = auth.authenticate(username=username,
    password=old_password)
    if user:
        user.set_password(new_password)
        user.save()
    

6、路由保護

  1. 說明

@login_required 修飾器修飾的view函式會先通過session key檢查是否登入,
已登入使用者可以正常的執行操作, 未登入使用者將被重定向到login_url指定的位
置. 若未指定login_url引數, 則重定向到settings.LOGIN_URL

如果是類檢視的話,可以使用LoginRequiredMixin

  1. 示例程式碼

    # settings 配置
    LOGIN_URL = '/day05/login/'
    # views
    @login_required
    def find_user_info(request):
    	pass
    @login_required(login_url='/day05/phone/login')
    def find_user_info(request):
    	pass
    
    
    class UserInfo(LoginRequiredMixin,View):    
        pass
    

7、驗證登入

  1. 說明

如果是真正的 User 物件,返回值恆為 True 。 用於檢查使用者是否已經通過了
認證。 通過認證並不意味著使用者擁有任何許可權,甚至也不檢查該使用者是否處於
啟用狀態,這只是表明使用者成功的通過了認證。 這個方法很重要, 在後臺用
request.user.is_authenticated判斷使用者是否已經登入,如果true則可以向
前臺展示request.user.name

  1. 示例程式碼

    在後臺的檢視函式⾥可以⽤request.user.is_authenticated判斷⽤戶是否登
    錄
    在前端頁面中可以⽤
    {% if user.is_authenticated %}
    {% endif %}
    判斷使用者是否登入
    

文章篇幅有限,具體可參考

https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index.html