IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 装饰器decorator实现Django的访问和权限控制 -> 正文阅读

[Python知识库]装饰器decorator实现Django的访问和权限控制


前言

最近在复习django时发现了装饰器的相关内容,觉得挺有意思的,为此做下记录。

一、装饰器语法

先说明一下装饰器,python的装饰器类似于java的注解,可以用在方法上面。按我的理解,被装饰器装饰的方法,其实是先执行装饰器里面的代码,然后再执行方法里面的代码。语法如下:

def 装饰器名字(传入方法名):
    # 这个函数名字随便起,下面返回的函数名要和这个函数名一致
    def 执行函数名(传入方法的参数列表):
    	# 你想做的操作
    	........
    	# 返回传入方法
        return 传入方法名(传入方法的参数列表)
    # 返回执行函数
    return 执行函数

二、装饰器解释

下面举个例子,decorator_count是我自定义的一个装饰器

def decorator_count(func):
    def dec_count(i, j):
        print("装饰器代码已执行")
        return func(i, j)
    return dec_count


@decorator_count
def count(i, j):
    print(i+j)


if __name__ == '__main__':
    count(1, 2)

以上程序的执行结果是:

装饰器代码已执行
3

为什么结果是这样,其实count()方法给装饰器装饰之后,装饰器里面的代码和下面代码类似:

# 这里参数变了
def decorator_count(count):
    def dec_count(i, j):
        print("装饰器代码已执行")
        # 这里也变了
        return count(i, j)
    return dec_count

这就不难看出,装饰器返回了dec_count()方法,而在dec_count()方法里面,又先执行了print,再执行count(i, j),所以才会有上面的输出顺序。

三、装饰器实现访问和权限控制

页面的访问是先判断用户是否登录,在返回页面,和上面的先执行print(),再执行count(i, j)是不是很像,那使用装饰器判断用户是否登录就很简单了

1、准备

先准备好有关的模型类,视图和页面,以你的实际项目为准,这里只给出有关的视图方法
自定义装饰器“decorator_logined.py”,判断用户是否已经登录

from django.shortcuts import redirect


# 装饰器名字
def already_login(func):
    # 这个函数名字随便起,下面返回的函数名要和这个函数名一致
    # 参数列表参考要传入函数
    def alr_login(request, *args, **kwargs):
        un = request.session.get("username")
        # 判断是否已经登录了
        if un:
            return func(request, *args, **kwargs)
        else:
            # 没登录的先登录
            return redirect('/before_index/')
    return alr_login

自定义装饰器“decorator_permission.py”,判断用户是否有权限操作

from django.http import HttpResponse


def validate_permission(func):
    def valid_per(request, *args, **kwargs):
        # 获取用户所在的用户组id
        group_id = request.session.get('group_id')
        # 判断是否有对应访问权限了
        if group_id == 0:
            return func(request, *args, **kwargs)
        else:
            return HttpResponse("你无权访问!")
    return valid_per

在视图中使用()装饰器用在首页和用户列表:

from django.shortcuts import render, redirect
from .forms import UserForm
from .models import User
from Decorator.decorator_permission import validate_permission
from Decorator.decorator_logined import already_login


# Create your views here.
# 登录
def login(request):
    if request.method == "GET":
        return render(request, "login/login.html")
    if request.method == "POST":
        # 获取数据
        obj = UserForm(request.POST)
        # 校验数据
        if obj.is_valid():
            # 获取obj里面的数据
            user = User.objects.values("id", "username", "group_id").filter(**obj.cleaned_data).first()
            # 在数据库中能找到对应用户
            if user:
                # 将相关信息保存到session中并返回
                request.session['id'] = user['id']
                request.session['username'] = user["username"]
                request.session['group_id'] = user["group_id"]
                # 重定向到首页
                return redirect('/index/')
            else:
                errmsg = {'errmsg': "用户名或者密码错误"}
                return render(request, 'login/login.html', errmsg)
        content = {"obj": obj}
        return render(request, 'login/login.html', content)
# 首页
@already_login
def index(request):
    # 获取用户名已经对应的用户组id
    username = request.session.get("username")
    group_id = request.session.get("group_id")
    content = {"username": username, "group_id": group_id}
    return render(request, 'login/index.html', content)


# 查看用户列表
@already_login
@validate_permission
def userList(request):
    userList = User.objects.all()
    content = {"userList": userList}
    return render(request, "user/user_list.html", content)


# 没登录用户进入首页时的跳转界面
def before_index(request):
    return render(request, "login/before_index.html")

注意:使用多个装饰器装饰同一个方法时装饰器是由上往下依次执行

2、测试

我的用户列表如下,只有group_id为0的用户能访问用户列表:
在这里插入图片描述
没登录时输入首页地址:
在这里插入图片描述
在这里插入图片描述
登录之后输入用户列表地址:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登录管理员账号输入用户列表地址:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大功告成!!!想要判断用户是否登录和用户操作权限,只需要引入对应的装饰器就可以啦。
有什么问题欢迎在评论区留言。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 15:45:02  更:2021-09-20 15:46:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 15:45:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码