1. 程式人生 > >Django—內置用戶權限管理

Django—內置用戶權限管理

mod 新的 django 改密 dir .py field mode t對象

內置用戶權限管理

對於註冊、登錄、驗證等功能我們可以自己編寫用戶管理應用,但Django也有一個內置的用戶權限管理系統。也是很強大的。

在哪可以看到?

技術分享圖片

關於用戶的信息都存放在這個表中。

技術分享圖片

auth模塊

from django.contrib import auth

其中有幾個常用的方法:

authenticate()

提供了用戶認證功能,即驗證用戶名以及密碼是否正確,一般需要username 、password兩個關鍵字參數。

如果認證成功(用戶名和密碼正確有效),便會返回一個 User 實例對象,否則返回None。

用法:

user = auth.authenticate(username=user, password=pwd)  #
進行認證

login(HttpRequest, user)

該函數接受一個HttpRequest對象,以及一個經過認證的User實例對象(也就是 authenticate方法返回的User對象)

該函數實現一個用戶登錄的功能。會在後端為該用戶生成相關session數據

通常 login() 與 authenticate() 一起配合使用。

用法:

def login(request):
    if request.method == POST:
        user = request.POST.get(user)
        pwd = request.POST.get(
pwd) # 通過內置驗證 user = auth.authenticate(username=user, password=pwd) if user: # 將登陸的信息封裝到request.user,包括session auth.login(request, user) return redirect(/index/) return render(request, "login.html")

這樣我們就可以在其他地方拿到用戶相關數據

def index(request):
    name 
= request.user.username # 通過user拿到相關信息 return render(request, index.html, {user: name})

logout(request)

該函數接受一個HttpRequest對象,無返回值。

當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。

用法:

def logout(request):
    auth.logout(request)  # 清除當前用戶的session信息
    return redirect(/login/)

is_authenticated()

判斷用戶是否登錄,登錄返回True,否則返回False。

用法:

def my_view(request):
  if not request.user.is_authenticated():  # 如果登錄失敗
    return redirect(%s?next=%s % (settings.LOGIN_URL, request.path))

login_requierd()

在執行函數之前先進行登錄校檢,是一個裝飾器

用法:

from django.contrib.auth.decorators import login_required
      
@login_required()   #  如果登錄了就執行 index 視圖函數
def index(request):
    cd = request.user.username
    return render(request, index.html, {user: cd})

若用戶沒有登錄,則會跳轉到django默認的 登錄URL ‘/accounts/login/ ‘ 並傳遞當前訪問url的絕對路徑 (登陸成功後,會重定向到該路徑)。

如果需要自定義登錄的URL,則需要在settings.py文件中通過LOGIN_URL進行修改

示例:

LOGIN_URL = /login/  # 這裏配置成你項目登錄頁面的URL

create_user()

auth 提供的一個創建新用戶的方法,需要提供必要參數(username、password)等。

用法:

from django.contrib.auth.models import User


def register(request):
    # 內置註冊普通 用戶
    User.objects.create_user(username=gz, password=123456)
    return HttpResponse("註冊成功")

當然我們也可以根據表單結合使用

create_superuser()

auth 提供的一個創建新的超級用戶的方法,需要提供必要參數(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_superuser(username=用戶名,password=密碼,email=郵箱,...)

check_password(password)

auth 提供的一個檢查密碼是否正確的方法,需要提供當前請求用戶的密碼。

密碼正確返回True,否則返回False。

用法:

ok = user.check_password(‘密碼‘)

set_password(password)

auth 提供的一個修改密碼的方法,接收 要設置的新密碼 作為參數。

註意:設置完一定要調用用戶對象的save方法!!!

用法:

user.set_password(password=xxxxx)
user.save()  # 不要忘了保存

擴展默認的auth_user表

內置的User表,就那些固定的字段。我想添加自己的字段怎麽辦?

我們可以通過繼承內置的 AbstractUser 類,來定義一個自己的Model類。

from django.contrib.auth.models import User, AbstractUser

# 通過繼承  擴展  
class UserInfo(AbstractUser):
    phone = models.IntegerField()
    addr = models.CharField(max_length=30)

註意:

如果擴展了內置的auth_user表之後,一定要在settings.py中告訴Django,我現在使用我新定義的UserInfo表來做用戶認證。寫法如下:

# 引用Django自帶的User表,繼承使用時需要設置
AUTH_USER_MODEL = "app名.UserInfo"

再次註意:

一旦我們指定了新的認證系統所使用的表,我們就需要重新在數據庫中創建該表,而不能繼續使用原來默認的auth_user表了

疑問:

如果我們擴展了表之後,那之前的用到內置函數可以用嗎?

(1)擴展表之後,表名就是models.py裏定義的表名

技術分享圖片

技術分享圖片

(2)其他關於auth的方法,不影響。

Django—內置用戶權限管理