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 modelsclass 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 hashlibSECRET_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 settingsclass 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"]returnreturn 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:returnreturn 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"]
    ​returnreturn 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:returnreturn 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"]
    }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程——动静态库

目录 一&#xff0c;关于动静态库 1.1 什么是库&#xff1f; 1.2 认识动静态库 1.3 动静态库特征 二&#xff0c;静态库 2.1 制作静态库 2.2 使用静态库 三&#xff0c;动态库 3.1 制作动态库 3.2 使用动态库一些问题 3.3 正确使用动态库三种方法 3.3.1 方法一&…

什么是BFC?

1、BFC&#xff1a;又叫块级格式化上下文&#xff08;block formatting context&#xff09;&#xff0c;就是页面上一个隔离的独立容器&#xff0c;容器里面的子元素不会影响到外面的元素。 2、BFC的原则&#xff1a;如果一个元素具有BFC&#xff0c;那么内部元素再怎么弄&am…

QuillEditor富文本结合vue3使用,可单独抽离成组件,富文本的内容可自定义

实现效果&#xff1a; 上方的粗体、斜体、字号、字体等各种信息支持自定义配置。 实现方式&#xff1a; 下面的介绍为分步骤的详细介绍&#xff0c;完整版纯享代码可参考这篇博客富文本QuillEditorvue3组件代码纯享版-CSDN博客 1.新建一个新文件--子组件&#xff0c;如命名为…

git应用最佳实践

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

QGraphicsView实现简易地图19『迁徙图』

模仿echarts的迁徙图效果 用到了前2篇制作的散点(涟漪效果)和两年前的路径动画类&#xff1b;然尾迹效果未依附路径&#xff0c;有待优化。 动态演示效果 静态展示图片 核心代码 #pragma once #include "Item/AbstractGeoItem.h" #include "DataStruct/GeoD…

php之文件操作代码审计

1 PHP文件操作函数 1.1 PHP文件操作函数 文件包含 include/require/include_once/require_once 文件读取 file_get_contents/fread/readfile/file 文件写入 file_put_contents/fwrite/mkdir/fputs 文件删除 unlink/rmdir 文件上传 move_uploaded_file/copy/rename 1.2 文…

IO流(1)

定义&#xff1a;存取和读取数据的解决方案 作用&#xff1a;用于读写数据&#xff08;本地文件、网络&#xff09; 分类&#xff1a; 一种是&#xff1a;输出流和输入流。 一种是&#xff1a;字节流和字符流。 字节流 字节流——FileOutputStream&#xff08;字节输出流&…

(函数)判断一句话中最长的单词(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//声明函数&#xff1b; int aiphabetic(char); int longest(char[]);int main() {//初始化变量值&#xff1b;int i;char line[100] { 0 };//获取用户输入字符…

Gradle命令打包 Execution failed for task ‘:app:compileDebugJavaWithJavac错误

Gradle命令打包的时候遇到的&#xff0c;Gradle的java版本不对导致的&#xff0c;用的17&#xff0c;换成11的就能正常打包了。

大模型管理工具Ollama搭建及整合springboot

目录 一、Ollama介绍 1.1 什么是Ollama 1.2 Ollama特点与优势 二、Ollama本地部署 2.1 版本选择 2.2 下载安装包 2.3 执行安装 2.4 Ollama常用命令 三、使用Ollama部署千问大模型 3.1 千问大模型介绍 3.2 部署过程 四、springboot接入Ollama 4.1 引入Ollama依赖 4…

树莓派LCD显示屏安装驱动详细教程

使用LCD显示屏有两种方式&#xff0c;1.如果你已安装好树莓派官方系统&#xff0c;需要单独安装驱动才可点亮显示屏。 2. 也可以直接烧录我们提供的系统 里面已含驱动程序。 一&#xff1a;连接方式 按照下图方式连接好LCD显示屏与树莓派主板 二&#xff1a;安装系统镜像&…

6个适合在家做的副业兼职,做得好的月入过万,适合上班族和宝妈

嘿&#xff0c;亲爱的朋友们&#xff01;是不是常常觉得钱包瘪瘪&#xff0c;却又因为种种原因无法外出兼职&#xff1f; 别急&#xff0c;我来为大家揭秘几个在家也能轻松赚钱的靠谱副业&#xff0c;让你足不出户也能月入过万&#xff0c;从此告别财务烦恼&#xff01; 副业一…

1.5.3 基于Java配置方式使用Spring MVC

本实战教程主要介绍了如何使用Java配置方式来使用Spring MVC框架。相较于XML配置方式&#xff0c;Java配置方式提供了一种更为简洁和灵活的配置方法。 项目创建与配置 创建一个Jakarta EE项目&#xff0c;并设置项目名称和位置。选择Jakarta EE 10版本&#xff0c;不添加依赖&a…

404.左叶子之和

计算给定二叉树的所有左叶子之和。 示例&#xff1a; 思路&#xff1a; 通过父节点来判断七子节点是不是我们要收集的元素。因为如果遍历到孩子节点&#xff0c;我们无法判断它是左孩子还是右孩子。 后序遍历&#xff0c;左右中。 判断当前节点是不是左叶子是无法判断的&…

271 基于matlab的可调Q因子小波变换故障诊断

基于matlab的可调Q因子小波变换故障诊断&#xff0c;可用在轴承、齿轮、活塞等故障诊断中&#xff0c;程序中包含了原始TQWT工具箱和轴承振动信号信号的谱包络的求取。通过仿真数据、实际轴承数据说明了方法的效果。程序已调通&#xff0c;可直接运行。 271 可调Q因子小波变换 …

01PCB设计概述

PCB设计概述 EDA electronic design automatic 电子设计自动化&#xff08;利用计算机来实现电子设计&#xff09; 分为 &#xff1a; 微电子&#xff08;芯片设计&#xff09;、硬件板卡&#xff08;PCB设计&#xff09; 画原理图、画PCB布线 要会绘制原理图库、和封装图库 元…

LeetCode84:柱形图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 代码 单调栈 class Solution { public:int largestRectangleArea(vector<int>& h…

AI 学习神器!大学生必备的 22个 AI 提示词模板

AI 学习神器&#xff01;大学生必备的 22个 AI 提示词模板 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…

基于优化Morlet小波的一维信号瞬态特征提取方法(MATLAB R2018A)

小波分析方法近些年逐步得到发展的一门数学分析技术&#xff0c;它对许多学科都有十分重要的影响。与傅立叶变换等其他传统方法相比&#xff0c;小波分解的方法中所用的小波基有着多种多样的结构&#xff0c;总结来说又包括正交小波系与非正交小波系。正交小波在信号处理领域目…