日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

django权限系统实现步骤_在django中实现一个简单的权限管理

發布時間:2025/3/15 windows 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 django权限系统实现步骤_在django中实现一个简单的权限管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先在models.py里先加入我們需要的表

Meta里的參數自己定義,我這里定義了3個,作為我的權限分類,定義好之后我們可以在django-admin里看到我們的權限分類,當我們添加用戶的時候也可以指定這3個權限給用戶。

class Permission(models.Model):

name = models.CharField("權限名稱", max_length=64)

url = models.CharField('URL名稱', max_length=255)

per_method = models.CharField('請求方法', max_length=10)

describe = models.CharField('描述', max_length=255)

def __str__(self):

return self.name

class Meta:

verbose_name = '權限表'

verbose_name_plural = verbose_name

#權限信息,這里定義的權限的名字,后面是描述信息,描述信息是在django admin中顯示權限用的

permissions = (

('readonly', '全平臺只讀'),

('app_admin','平臺管理員權限'),

('dashboard','儀表盤只讀'),

定義好我們的權限表,我們再定義個權限判斷的方法

在models.py的同級目錄下新建一個permission.py,名字隨意定

# -*- coding:utf-8 -*-

from django.shortcuts import render

from app.models import *

from django.db.models import Q

from django.urls import resolve #此方法可以將url地址轉換成url的name

import logging

from logging.handlers import TimedRotatingFileHandler

logger = logging.getLogger("ALERT LOG FORMAT")

logger.setLevel(logging.DEBUG)

LOG_FILE="/tmp/alert.log"

fh = TimedRotatingFileHandler(LOG_FILE,when='D',interval=1,backupCount=30) #按天分割日志,保留30天

fh.setLevel(logging.DEBUG)

formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")

fh.setFormatter(formatter)

logger.addHandler(fh)

def perm_check(request, *args, **kwargs):

user_perm = list(request.user.get_all_permissions()) #獲取用戶權限

if len(user_perm) < 0:

print("用戶沒有權限")

return False

user_method = request.method #獲取用戶的方法get|post

# get_perm = Permission.objects.filter(name=user_perm) #使用用戶權限名稱查找用戶的具體權限

url_obj = resolve(request.path_info)

url_name = url_obj.url_name #獲取當前用戶訪問的url地址

for perm in user_perm:

query = Permission.objects.filter(name=perm.split(".")[1])

print(query)

method = query[0].per_method

url = query[0].url

if url == "ALL" and method == "ALL":

print("用戶具有平臺管理員權限")

return True

elif url == "ALL" and method == "GET":

print("用戶具有平臺只讀權限")

return True

else:

if url_name == url and user_method == method:

print("權限已經匹配")

return True

else:

print("權限沒有匹配")

return False

def check_permission(fun): #定義一個裝飾器,在views中應用

def wapper(request, *args, **kwargs):

if perm_check(request, *args, **kwargs): #調用上面的權限驗證方法

return fun(request, *args, **kwargs)

return render(request, '403.html', locals())

return wapper

這個方法會提取用戶的權限和上面我們定義的表中的權限相匹配,成功的返回True,否則返回False

下面是我簡單定義的權限

(root[@127.0.0.1](https://my.oschina.net/u/567043):)[app]> select * from app_permission;

+----+-----------+-----------+------------+-----------------------+

| id | name | url | per_method | describe |

+----+-----------+-----------+------------+-----------------------+

| 1 | dashboard | dashboard | GET | 主頁瀏覽權限 |

| 2 | app_admin | ALL | ALL | 平臺管理員權限 |

| 4 | readonly | ALL | GET | 全平臺只讀 |

+----+-----------+-----------+------------+-----------------------+

好了,最后在views里調用

from app.permission import check_permission

@csrf_exempt

@check_permission

def backup_recovery(request):

if request.user == "AnonymousUser":

return HttpResponseRedirect('/login')

data = backup_failure.objects.all()

return render(request,'backup_recovery.html',{'data':data})

簡單的使用裝飾器的方法調用一下即可。

總結

以上是生活随笔為你收集整理的django权限系统实现步骤_在django中实现一个简单的权限管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。