django之auth系統

1-Auth系統中的表

(1)auth系統的數據表

在這裏插入圖片描述
從表的名稱我們就能看出,
auth_user,auth_group,auth_permission分別
存放了用戶,用戶組,權限的信息表.
另外三張表就是多對多的關係表

User:User是auth模塊中維護用戶信息的關係模式(繼承了models.Model), 數據庫中該表被命名爲auth_user.
Group:User對象中有一個名爲groups的多對多字段, 多對多關係由auth_user_groups數據表維護。Group對象可以通過user_set反向查詢用戶組中的用戶。
Permission:Django的auth系統提供了模型級的權限控制, 即可以檢查用戶是否對某個數據表擁有增(add), 改(change), 刪(delete)權限

(2)auth系統中User模型常用屬性和方法

在這裏插入圖片描述

(3)auth認證系統功能

create_user 創建用戶
authenticate 驗證登錄
login 記住用戶的登錄狀態
logout 退出登錄
is_authenticated 判斷用戶是否登錄
login_required 判斷用戶是否登錄的裝飾器

(4)使用auth系統

在auth系統當中,django已經爲我們提供了一個用戶身份驗證,用戶組和權限管理這些功能, 那麼就可以使用它來完善我們現有的這個項目.

接下來我們要在現有的項目中實現以下功能:

1.使用內置的auth_user表來存儲用戶註冊信息.

2.使用auth系統中的login,logout,authenticate實現登錄,退出和驗證登錄

3.給blog中的視圖設置登錄使用權限

4.給添加博客設置用戶的權限

準備工作:
1.創建一個新的app,並將app註冊.
2.準備好之前使用過的登錄註冊的模板和form表單的驗證.
3.給視圖配置好相應的url路由.
4.導入我們需要使用的auth中的User模型,login,logout,authenticate方法.

注意: 對於這個登錄註冊的例子中, 我們把之前自己定義的模型類改成了使用auth系統中的User模型類, 在User類中同樣存在着用戶名,密碼,郵箱這幾個字段,
所以我們可以繼續使用之前的form表單和之前用過的模板

(5)使用auth系統實現登錄註冊

1-使用auth系統實現登錄註冊

2-使用auth系統實現狀態保持與退出

3-login_required裝飾器

在沒有登錄的狀態下去訪問我們的blog中主頁的url時就會出現跳轉到登錄頁

4-next url的使用

從剛纔的登錄頁跳轉中,我們會看到一個next的參數,
這個參數前面的需要登錄的那個視圖的url
在這裏插入圖片描述
代碼:
views.py

python
from django.contrib.auth.decorators import login_required
from django.shortcuts import render,redirect,reverse
from django.views import View
from django.http import HttpResponse
from django.contrib.auth.models import User #導入User模型 (註冊)
from django.contrib.auth import login , logout #保存狀態
from django.contrib.auth import authenticate  #認證django提供的用戶表

def index(request):
    """
    查找 如果查到了就直接顯示登錄狀態  沒有就提示登錄
    :param request:
    :return:
    """
    return render(request,'zuoye/index.html')


def exit(request):
    logout(request)
    return redirect(reverse("zuoye:index"))
    #註冊
class RegistView(View):
    def get(self,request):
        return render(request,"zuoye/res.html")

    def post(self, request):
        username = request.POST.get("username")
        password = request.POST.get("password")
        email = request.POST.get("email")
        #print(email)

        #存入數據到表中
        User.objects.create_user(username=username,password=password,email=email)  #創建普通用戶

        return HttpResponse("普通用戶註冊成功!")

#登錄

class LogView(View):
    def get(self,request):
        return render(request,'zuoye/log.html')

    def post(self, request):
        username = request.POST.get("username")
        # request.session["username"] = username
        # request.session.set_expiry(7 * 24 * 3600)
        password = request.POST.get("password")
        #查詢用戶表中用戶是否存在
        user = authenticate(username=username,password=password)

        if user:
            login(request,user) #直接登錄 保存狀態
            next_url = request.GET.get("next")
            if next_url:
                print(next_url)
                return redirect(next_url) #沒有權限 就返回到之前的頁面
            return HttpResponse("登錄成功") #沒有參數就顯示登錄成功
        else:
            return HttpResponse("用戶名或者密碼錯誤!")


#第一種方式  如果用戶沒有登錄  跳轉到登錄頁
"""def Detail(request):
    if request.user.is_authenticated: #判斷用戶是否登錄
        return HttpResponse("AAAAAA")
  else:
        return redirect("zuoye:log")
"""
#第二種方式  使用函數裝飾器
@login_required
def Detail(request):
    return HttpResponse("AAAAAA")

urls.py中配置

from django.urls import path
from . import views
app_name = "zuoye"
urlpatterns = [ 
  	path('res/',views.RegistView.as_view(),name="res"),
    path('log/',views.LogView.as_view(),name="log"),
    path('index/',views.index,name="index"),
    path('exit/',views.exit,name="exit"),
    path('detail/',views.Detail,name="detail"),
]

settings.py中配置跳轉路由

LOGIN_URL = "/zuoye/log"  #如果用戶沒有登錄  就跳轉到登錄頁

templates模板下的app目錄下index.html log.html res.html 分別爲首頁 登錄 註冊
index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
{{ request.user }}<br>
<a href="{% url 'zuoye:detail' %}">詳情頁</a><br>
<a href="{% url 'zuoye:res' %}">註冊</a><br>
<a href="{% url 'zuoye:log' %}">登錄</a><br>
<a href="{% url 'zuoye:exit' %}">退出</a>
</body>
</html>

log.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="請輸入用戶名"><br>
    <input type="password" name="password" placeholder="請輸入密碼"><br>
    <input type="checkbox" name="remember">記住我 <br>
    <input type="submit" value="提交登錄"><br>
</form>
</body>
</html>

res.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <input type="text" name="username" placeholder="請輸入用戶名"><br>
    <input type="password" name="password" placeholder="請輸入密碼"><br>
    <input type="email" name="email" placeholder="請輸入郵箱號"><br>
    <input type="submit" value="提交註冊"><br>

</form>
</body>
</html>

2-登錄註冊實現

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

3-權限的實現(增刪改查)

在這裏插入圖片描述
查看數據庫中auth_permission這張表,在裏面有所有的表的一些操作權限,這些是在表創建的同是添加進來的數據

(1)permission_required裝飾器

@permission_required("zuoye.delete_users") #app.delete_users 添加權限
def delete_user(request):
    Users.objects.all().first().delete() #普通用戶沒有權限  用戶沒有登錄 沒有權限刪除
    return HttpResponse("刪除成功")

(2)Permission權限模型

注意:如果是超級用戶是擁有所有權限的

#查看普通用戶能夠添加什麼權限
在這裏插入圖片描述
views.py

python
from django.contrib.auth.decorators import login_required,permission_required
from django.contrib.auth.models import User,Permission #導入User模型 (註冊) 權限表
from .models import Users #自定義的模型表
#第二種方式  使用函數裝飾器
@login_required
def Detail(request):
    sang = User.objects.get(id=3)  #用戶表
    delete_user = Permission.objects.get(id=27) #權限表  刪除權限
    sang.user_permissions.add(delete_user) #添加權限
    return HttpResponse("AAAAAA")



#添加權限

#刪除用戶
@permission_required("zuoye.delete_users") #app.delete_users 添加權限
def delete_user(request):
    Users.objects.all().first().delete() 
    #普通用戶沒有權限  用戶沒有登錄 沒有權限刪除
    return HttpResponse("刪除成功")

models.py

from django.db import models

# Create your models here.
class Users(models.Model):
    username = models.CharField(max_length=20,unique=True,verbose_name="用戶名")
    password = models.CharField(max_length=200,verbose_name="密碼")

效果演示:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

group:組

在這裏插入圖片描述

views.py

def Detail(request):
    # sang = User.objects.get(id=3)  #用戶表
    # delete_user = Permission.objects.get(id=27) #權限表  刪除權限
    # sang.user_permissions.add(delete_user) #添加權限

    #給組添加權限
    Group.objects.get_or_create(name="vip1")
    
    return HttpResponse("AAAAAA")

在這裏插入圖片描述
給組添加權限

@login_required
def Detail(request):
    # sang = User.objects.get(id=3)  #用戶表
    # delete_user = Permission.objects.get(id=27) #權限表  刪除權限
    # sang.user_permissions.add(delete_user) #添加權限

    #給組添加權限
    #Group.objects.get_or_create(name="vip1")
    vip = Group.objects.get(id=1)
    delete_user = Permission.objects.get(id=27)
    vip.permissions.add(delete_user)
    
    #把用戶放入組中
    
    return HttpResponse("AAAAAA")

在這裏插入圖片描述
在這裏插入圖片描述
將用戶分入組中
在這裏插入圖片描述
在這裏插入圖片描述
views.py

@login_required
def Detail(request):
    #把用戶放入組中
    vip = Group.objects.get(id=1)
    hh = User.objects.get(id=6)
    hh.groups.add(vip) #將用戶添加進組中
    return HttpResponse("AAAAAA")

效果演示:

在這裏插入圖片描述
說明組中的用戶添加權限成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章