Django之auth模塊用戶認證模塊

1、Auth模塊html

1)auth模塊是什麼。登陸後臺使用的帳號密碼,則就是使用的auth模塊建立的表前端

Auth模塊是Django自帶的用戶認證模塊:

咱們在開發一個網站的時候,無可避免的須要設計實現網站的用戶系統。
此時咱們須要實現包括用戶註冊、用戶登陸、用戶認證、註銷、修改密碼等功能,這還真是個麻煩的事情呢。
Django做爲一個完美主義者的終極框架,固然也會想到用戶的這些痛點。它內置了強大的用戶認證系統--auth,
它默認使用 auth_user 表來存儲用戶數據。

2)auth模塊的功能django

2.1)導入auth模塊json

from django.contrib import auth

2.2)auth模塊下的方法。authenticate()。認證功能後端

提供了用戶認證功能,即驗證用戶名以及密碼是否正確,通常須要username 、password兩個關鍵字參數。
若是認證成功(用戶名和密碼正確有效),便會返回一個 User 對象。
authenticate()會在該 User 對象上設置一個屬性來標識後端已經認證了該用戶,且該信息在後續的登陸過程當中是須要的。
用法:
user = authenticate(username='usernamer',password='password')

  具體使用以下app

from django.contrib import auth
def auth_test(request):
    username = request.POST['username']
    password = request.POST['password']
    user = auth.authenticate(username=username, password=password)
    if user:
        print(user.username)
        return HttpResponse("登陸成功")
    return HttpResponse("登陸失敗")
authenticate使用

 2.3)login(request,user)。登陸功能(認證成功後)框架

from django.contrib import auth
def auth_test(request):
    user = auth.authenticate(request,username='user2',password='user123456')    # 認證
    print(user)
    if user:
        print(user.username)    # 登陸的用戶名
        auth.login(request,user)
    return render(request,'auth_test.html')
auth.login(request,user)

登陸後,前端也可獲取到登陸的用戶名ide

<body>
<div>{{ request.user }}</div>
</body>
{{ request.user }}

在前端也可判斷請求是否經過。函數

<body>
<div>{{ request.user }}</div>
<div>{{ request.user.is_authenticated }}</div>
</body>
is_authenticated

2.4)auth.logout(request)。用戶退出方法網站

def auth_test_logout(request):
    auth.logout(request)
    return HttpResponse('退出成功')
auth.logout(request)

2、auth模塊擴展。用於建立用戶,登陸裝飾器

1)新增字段

1.1)修改配置文件settings.py

# AUTH_USER_MODEL = "app名.用戶名錶"
AUTH_USER_MODEL = "app01.UserInfo"  # 指定表
settings.py

1.2)建立的表,繼承AbstractUser。可重寫表結構

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=32)
AbstractUser

2)建立用戶

def auth_test_creat_user(request):
    # 管理員
    UserInfo.objects.create_superuser(username='usersb1',password=123,email='11111111@qq.com')
    # 普通用戶
    UserInfo.objects.create_user(username='usersb2',password=123,email='11111121@qq.com')
    return HttpResponse('成功')
creat_user

3.1)登陸裝飾器方法一。視圖函數前加上url

先導入裝飾模塊:from django.contrib.auth.decorators import login_required

@login_required(login_url='/auth_test_login/')   # 登陸之後纔能有的操做
def auth_test_logout(request):
    auth.logout(request)
    return HttpResponse('退出成功')
@login_required

login_url='/auth_test_login/',沒有登陸跳轉到的url

3.2)登陸裝飾器方法二。settings全局配置

LOGIN_URL = '/auth_test_login/'
settings.py

視圖函數前就不用加url了

@login_required   # 登陸之後纔能有的操做
def auth_test_logout(request):
    auth.logout(request)
    return HttpResponse('退出成功'
View Code

4) cbv模式加裝飾器

4.1) 運用於類裏面的單個函數

from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
@method_decorator(login_required,name='get')
class Host(View):
    def get(self, request):
        host_list = models.Host.objects.all()
        return render(request, 'host.html', {"host_list": host_list})

    def delete(self,request):
        print('delete')
        response = {'status': True, 'message': None, 'data': None}
        body = QueryDict(request.body)
        try:
            nid = body.get('nid')
            print(nid)
            models.Host.objects.filter(id=nid).delete()
            response['data'] = nid
        except Exception as e:
            response['status'] = False
            response['message'] = '刪除錯誤'
        result = json.dumps(response, ensure_ascii=False)
        return HttpResponse(result)
View Code

4.2)運用於類裏面的全部函數

@method_decorator(login_required,name='dispatch')
class Host(View):
    def get(self, request):
        host_list = models.Host.objects.all()
        return render(request, 'host.html', {"host_list": host_list})
View Code

5)檢查密碼。check_password(password)。

 密碼正確返回True,不然返回False。

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

tag = user.check_password('密碼')
if tag:
    print("ok")
else:
    print("錯誤")
check_password('密碼')

6)修改密碼。set_password(password)

auth 提供的一個修改密碼的方法,接收 要設置的新密碼 做爲參數。
注意:設置完必定要調用用戶對象的save方法!!!
用法:
user.set_password(password='')
user.save()
set_password(password='')

一個簡單的修改密碼示例

@login_required
def set_password(request):
    user = request.user
    err_msg = ''
    if request.method == 'POST':
        old_password = request.POST.get('old_password', '')
        new_password = request.POST.get('new_password', '')
        repeat_password = request.POST.get('repeat_password', '')
        # 檢查舊密碼是否正確
        if user.check_password(old_password):
            if not new_password:
                err_msg = '新密碼不能爲空'
            elif new_password != repeat_password:
                err_msg = '兩次密碼不一致'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/login/")
        else:
            err_msg = '原密碼輸入錯誤'
    content = {
        'err_msg': err_msg,
    }
    return render(request, 'set_password.html', content)
View Code

7)User對象的屬性

User對象屬性:username, password
is_staff : 用戶是否擁有網站的管理權限.
is_active : 是否容許用戶登陸, 設置爲 False,能夠在不刪除用戶的前提下禁止用戶登陸。
View Code

3、總結(auth模塊使用)

配置文件:settings.py
    AUTH_USER_MODEL = "app01.UserInfo"  # 建立擴展用戶表
    LOGIN_URL = '/auth_test_login/'        # 裝飾器的跳轉登陸url
建立表:models.py    
    from django.contrib.auth.models import AbstractUser        # 繼承 AbstractUser
    class UserInfo(AbstractUser):
        nid = models.AutoField(primary_key=True)
        telephone = models.CharField(max_length=32)
視圖函數方法:views.py
    auth.authenticate(request,username='user2',password='user123456')    # 認證
    auth.login(request,user)    # 登陸
    print(request.user)            # 屬性,用戶名
    request.user.is_authenticated    # 屬性,判斷請求是否經過
    
    @login_required                # 裝飾器
    UserInfo.objects.create_superuser()        # 建立超級管理員
    UserInfo.objects.create_user()            # 建立普通管理員
    check_password(password)    # 檢查密碼
    set_password(password)        # 修改密碼
    
前端文件:
    request請求體裏面含有user對象
    後端有的屬性,前端也能獲取到
    {{ request.user }}
    {{ request.user.is_authenticated }}

用戶權限控制:auth表註冊

                        is_staff控制 

相關文章
相關標籤/搜索