8-Django项目--登录及权限

目录

templates/login/login.html

 templates/login/404.html

views/login.py

utils/pwd_data.py

auth.py

settings.py

登录及权限

登录

views.py

中间件

auth.py


templates/login/login.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'css/bootstrap.css'%}">
</head>
<body>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        html {
            height: 100%;
        }
        body {
            height: 100%;
        }
        .container {
            height: 100%;
            width: 100%;
            background-image: linear-gradient(to right, #fbc2eb, #a6c1ee);
        }
        .login-wrapper {
            background-color: #fff;
            width: 358px;
            height: 588px;
            border-radius: 15px;
            padding: 0 50px;
            position: relative;
            left: 50%;
            top: 50%;
            transform: translate(-50%, -50%);
        }
        .header {
            font-size: 38px;
            font-weight: bold;
            text-align: center;
            line-height: 200px;
        }
        .input-item {
            display: block;
            width: 100%;
            margin-bottom: 20px;
            border: 0;
            padding: 10px;
            border-bottom: 1px solid rgb(128, 125, 125);
            font-size: 15px;
            outline: none;
        }
        .input-item:placeholder {
            text-transform: uppercase;
        }
        .btn {
            text-align: center;
            padding: 10px;
            width: 100%;
            margin-top: 40px;
            background-image: linear-gradient(to right, #a6c1ee, #fbc2eb);
            color: #fff;
        }
        .msg {
            text-align: center;
            line-height: 88px;
        }
        a {
            text-decoration-line: none;
            color: #abc1ee;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="login-wrapper">
            <div class="header">Login</div>
            <div class="form-wrapper">
                <form method="post" novalidate>
                    {% csrf_token %}
                    {{ form.username }}
                    {{ form.password }}
                    <span style="color: red">{{ form.password.errors.0 }}</span>
                    <button class="btn" type="submit">Login</button>
                </form>
            </div>

        </div>
    </div>
</body>
</html>

</body>
</html>

 templates/login/404.html

--防止越权访问目录及文件...

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div style="background-color: red;width: 500px; height: 500px">没权限</div>
</body>
</html>

views/login.py

# -*- coding:utf-8 -*-
import requests
from django.shortcuts import render, redirect, HttpResponse
from demo_one.utils import pwd_data
from django import forms
from demo_one import models


class LoginForm(forms.Form):
    username = forms.CharField(label="用户名", widget=forms.TextInput(
        attrs={"class": "input-item", "autocomplete": "off", "placeholder": "请输入用户名"}))
    password = forms.CharField(label="密码", widget=forms.PasswordInput(
        attrs={"class": "input-item", "autocomplete": "off", "placeholder": "请输入密码"}))

    def clean_password(self):
        pwd = self.cleaned_data.get("password")
        # print(self.cleaned_data)
        return pwd_data.md5(pwd)


def login(request):
    if request.method == "GET":
        form = LoginForm()
        return render(request, "login/login.html", {"form": form})

    form = LoginForm(data=request.POST)
    if form.is_valid():
        # 去数据库进行校验
        # print(form.cleaned_data)

        admin_object = models.Adminrole.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            # 给输入框添加一个错误提示
            form.add_error("password", "用户名或密码错误")
            return render(request, "login/login.html", {"form": form})
        # 登录成功之后
        # 将登录信息存储在session当中
        request.session["info"] = {"id": admin_object.id, "username": admin_object.username,
                                   "password": admin_object.password, "role": admin_object.role}
        # 时效性
        request.session.set_expiry(60 * 60 * 24 * 30)
        # 登录成功后跳转到首页
        return redirect("/")
    return render(request, "login/login.html", {"form": form})


def logout(request):
    request.session.clear()
    return redirect("/login/")

utils/pwd_data.py

--登录密码进行加密传输.

# -*- coding:utf-8 -*-
import hashlib


SECRET_KEY = ''
def md5(data):
    # 加盐
    obj_md5 = hashlib.md5(SECRET_KEY.encode("utf-8"))
    obj_md5.update(data.encode("utf-8"))
    return obj_md5.hexdigest()




auth.py

--登录&权限进行校验.(不同权限看到的内容信息量不一样.)

# -*- coding:utf-8 -*-
import requests
from django.shortcuts import redirect,HttpResponse,render
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings

class AuthMiddleware(MiddlewareMixin):
    # 登录校验
    def process_request(self, request):
        # 登录页无需校验
        if request.path_info in ["/login/", "/logout/"]:
            return

        # 读取当前用户的信息,如果读取到了,说明已经登录成功
        info_dict = request.session.get("info")
        if info_dict:
            request.unicom_id = info_dict["id"]
            request.unicom_username = info_dict["username"]
            request.unicom_role = info_dict["role"]

            return
        return redirect("/login/")


    # 权限校验
    def process_view(self, request, view_func, args, kwargs):
        if request.path_info in ["/login/", "/logout/"]:
            return

        # 获取当前用户的角色身份
        role = request.unicom_role

        # 获取当前角色不具备的权限
        user_permission_list = settings.UNICOM_PERMISSION[role]

        # 当前身份有哪些权限
        if request.resolver_match.url_name not in user_permission_list:
            return
        return render(request, "login/404.html")


settings.py

(不同权限看到的内容信息量不一样.)


登录及权限

登录

  • views.py

    # -*- coding:utf-8 -*-
    import requests
    from django.shortcuts import render, redirect, HttpResponse
    from demo_one.utils import pwd_data
    from django import forms
    from demo_one import models
    ​
    ​
    class LoginForm(forms.Form):
        username = forms.CharField(label="用户名", widget=forms.TextInput(
            attrs={"class": "input-item", "autocomplete": "off", "placeholder": "请输入用户名"}))
        password = forms.CharField(label="密码", widget=forms.PasswordInput(
            attrs={"class": "input-item", "autocomplete": "off", "placeholder": "请输入密码"}))
    ​
        def clean_password(self):
            pwd = self.cleaned_data.get("password")
            # print(self.cleaned_data)
            return pwd_data.md5(pwd)
    ​
    ​
    def login(request):
        if request.method == "GET":
            form = LoginForm()
            return render(request, "login/login.html", {"form": form})
    ​
        form = LoginForm(data=request.POST)
        if form.is_valid():
            # 去数据库进行校验
            # print(form.cleaned_data)
    ​
            admin_object = models.Adminrole.objects.filter(**form.cleaned_data).first()
            if not admin_object:
                # 给输入框添加一个错误提示
                form.add_error("password", "用户名或密码错误")
                return render(request, "login/login.html", {"form": form})
            # 登录成功之后
            # 将登录信息存储在session当中
            request.session["info"] = {"id": admin_object.id, "username": admin_object.username,
                                       "password": admin_object.password, "role": admin_object.role}
            # 时效性
            request.session.set_expiry(60 * 60 * 24 * 30)
            # 登录成功后跳转到首页
            return redirect("/")
        return render(request, "login/login.html", {"form": form})
    ​
    ​
    def logout(request):
        request.session.clear()
        return redirect("/login/")

中间件

  • auth.py

    # -*- coding:utf-8 -*-
    import requests
    from django.shortcuts import redirect,HttpResponse,render
    from django.utils.deprecation import MiddlewareMixin
    from django.conf import settings
    ​
    class AuthMiddleware(MiddlewareMixin):
        # 登录校验
        def process_request(self, request):
            # 登录页无需校验
            if request.path_info in ["/login/", "/logout/"]:
                return
    ​
            # 读取当前用户的信息,如果读取到了,说明已经登录成功
            info_dict = request.session.get("info")
            if info_dict:
                request.unicom_id = info_dict["id"]
                request.unicom_username = info_dict["username"]
                request.unicom_role = info_dict["role"]
    ​
                return
            return redirect("/login/")
    ​
    ​
        # 权限校验
        def process_view(self, request, view_func, args, kwargs):
            if request.path_info in ["/login/", "/logout/"]:
                return
    ​
            # 获取当前用户的角色身份
            role = request.unicom_role
    ​
            # 获取当前角色不具备的权限
            user_permission_list = settings.UNICOM_PERMISSION[role]
    ​
            # 当前身份有哪些权限
            if request.resolver_match.url_name not in user_permission_list:
                return
            return render(request, "login/404.html")
  • settings.py

    UNICOM_PERMISSION = {
        "admin": [],
        "teacher": ["admin_list", "add_admin", "modify_admin", "del_admin", "reset_admin"],
        "user": ["admin_list", "add_admin", "modify_admin", "del_admin", "reset_admin",
                 "asset_data", "add_asset", "modify_asset", "delete_asset", "del_data"]
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/669508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

掘金AI 商战 宝典 初级班:如何用AI做文案(实战实操 现学现用 玩赚超值)

未来会用AIE剑客将干掉99.99%不会AI的人! 课程目录&#xff1a; 10-第十讲用AI面试 11-第十一讲用AI写演讲稿 12-第十二讲用AI写工作总结 13-第十三讲用AI写日报周报 14-第十四讲用AI拟定各类合同 15-第十五讲用AI写课程教案 16-第十六讲用AI做商业分析 17-第十七讲用…

20 - grace数据处理 - 地下水储量计算过程分解 - 地下水储量计算

20 - grace数据处理 - 地下水储量计算过程分解 - 地下水储量计算 0 引言1 地下水储量变化计算过程0 引言 由水平衡方程可以将地下水储量的计算过程分解为3个部分,第一部分计算陆地水储量变化、第二部分计算地表水储量变化、第三部分计算冰后回弹改正、第四部分计算地下水储量变…

Kotlin使用Dagger2但无法生成对应类 Unresolved reference: DaggerMyComponent

最近在使用Dagger2时&#xff0c;遇到这个错误&#xff0c;app/build/generated/source/没有生成对应类&#xff0c;没有生成如下类&#xff0c;网上看了许多博客替换版本&#xff0c;添加dagger2的其他依赖均未成功&#xff0c;最终看到一篇大佬的文章才终于得以解决 解决&am…

electron打包时资源下载失败cannot resolve xxx/30.0.9/electron-v30.0.9-win32-ia32.zip

同学们可以私信我加入学习群&#xff01; 正文开始 问题描述解决方案总结 问题描述 最近electron更新频繁&#xff0c;而我在用electron做个人项目&#xff0c;对稳定性没有太高要求&#xff0c;希望保持着electron的最新版本&#xff0c;所以就没有固定版本。 单位网络不太好…

Java(八)——String类

文章目录 String类String的构造及内存分布构造内存分布 常用方法判等比较查找转化替换拆分截取 字符串的不可变性StringBuilder和StringBuffer String类 C语言中没有专门的字符串类型&#xff0c;一般使用字符数组或字符指针表示字符串&#xff0c;而字符串的函数需要包含头文…

【数据结构】二叉树:简约和复杂的交织之美

专栏引入&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累…

PWN-栈迁移

栈迁移 题目&#xff1a;BUUCTF在线评测 (buuoj.cn) 知识点&#xff1a;栈迁移 使用情况&#xff1a;题目中有栈溢出&#xff0c;但是 栈溢出的范围 有限&#xff0c;导致构造的ROP链不能完全写入到栈中&#xff0c;此时需要进行栈迁移&#xff0c;将栈迁移到能接受更多数据的…

GD32F系列MCU片上Flash中Code区和Data区使用解密

GD32F系列MCU产品片上Flash分Code区和Data区&#xff0c;以GD32F303系列为例&#xff0c;从GD32F303xx Datasheet中可以获取code区和data区大小&#xff0c;那Code区和Data区在代码执行上有什么差别呢&#xff1f; Code区代码运行0等待&#xff0c;一般用于存放实时性要求高的代…

STM32(八):独立看门狗 (标准库函数)

前言 上一篇文章介绍了STM32单片机中的USART串口通信&#xff0c;这篇文章我们来介绍一下如何用STM32单片机中的独立看门狗来实现检测按键点灯的程序。 一、实验原理 单片机系统会由于受到外界的干扰&#xff0c;而造成程序执行紊乱&#xff0c;系统无法正常运行。为了防止这…

混合模型方差分析

文章目录 一、说明二、受试者“间”因素和受试者“内”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假设 一、说明 在本文中&#xff0c;我将讨论一种称为混合模型方差分析的方差分析变体&#xff0c;也称为具有重复测量的 2 因素方差分析。…

python替换占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具&#xff0c;有一个配置文件&#xff0c;希望实现类似shell命令的&#xff0c;定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

word里面没有Acrobat选项

加载项被禁止&#xff0c;选择项里面&#xff0c;没有Acrobat选项 文件-》选项 加载项-》com加载项-》转到 添加Acrobat 出现Acrobat选项

阿里云部署nodejs

目录 1、安装node.js 1-1 进入opt/software 1-2 下载node.js安装包 1-3 解压 2 配置环境变量 2-1 vim中配置环境变量 2-2 命令行中保存环境变量 2-3 检查安装版本 2-3 更换镜像 3、上传node.js项目 1-1 启动项目 1-2 配置对应的安全组 ​编辑 4、pm2启动多个node项…

《PNAS》和《Nature Communications》仿章鱼和蜗牛的粘液真空吸附,赋予了机器人吸盘新的“超能力”

想象一下&#xff0c;如果机器人能够像章鱼一样牢牢吸附在粗糙崎岖的岩石上&#xff0c;或者像蜗牛那样在墙面上悠然负重爬行&#xff0c;那会是多么神奇的一幕&#xff01;近日&#xff0c;布里斯托大学机器人实验室的Jonathan Rossiter教授课题组就为我们带来了这样的“超能力…

Java_Mybatis

Mybatis是一款优秀的持久层框架&#xff0c;用户简化JDBC(使用Java语言操作关系型数据库的一套API)开发 使用Mybatis查询所有用户数据&#xff1a; 代码演示&#xff1a; UserMapper&#xff1a; Mapper //被调用时会通过动态代理自动创建实体类&#xff0c;并放入IOC容器中…

一文了解JVM面试篇(上)

Java内存区域 1、如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。 2、JVM 的主要组成…

JVM学习-详解类加载器(一)

类加载器 类加载器是JVM执行类加载机制的前提 ClassLoader的作用 ClassLoader是Java的核心组件&#xff0c;所有的Class都是由ClassLoader进行加载的&#xff0c;ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部&#xff0c;转换为一个与目标类型对应的ja…

什么是TLAB?

这个得从内存申请说起。 一般而言生成对象需要向堆中的新生代申请内存空间&#xff0c;而堆又是全局共享的&#xff0c;像新生代内存又是规整的&#xff0c;是通过一个指针来划分的。 内存是紧凑的&#xff0c;新对象创建指针就右移对象大小size即可&#xff0c;这叫指针加法…

Linux 的权限

目录 Linux 的用户 root 用户 和 普通用户 如何新建普通用户&#xff1f; 如何切换用户&#xff1f; 一开始是以 root 用户登录&#xff1a; 一开始以普通用户登录&#xff1a; 如何删除用户&#xff1f; Linux文件权限 什么是读权限&#xff08; r &#xff09;&#…

数据结构学习笔记

1. 数组 (Array) 定义 数组是一种线性数据结构&#xff0c;用于存储固定大小的相同类型元素集合。每个元素都有一个索引&#xff0c;用于快速访问。 特点 优点&#xff1a;访问速度快&#xff0c;通过索引直接访问O(1)时间复杂度。缺点&#xff1a;大小固定&#xff0c;插入…