django实现登录和登录的鉴权

1、创建数据库的管理员表

在models.py 中定义admin表,为了简单,表里只有用户名和密码还有默认加的id 三个字段

from django.db import models# Create your models here.class Admin(models.Model):username = models.CharField(verbose_name="用户名",max_length=16)passwd = models.CharField(verbose_name="密码",max_length=64)

执行创建表的语句

py -3 manage.py makemigrations
py -3 manage.py migrate

然后自己手动插入一些用户

2、登录界面和登录视图

在urls.py中加入路径

from django.urls import path
from app01.views import user,depart,pretty,admin,accounturlpatterns = [#path('admin/', admin.site.urls),path('depart/list/', depart.depart_list),path('depart/add/', depart.depart_add),path('depart/delete/', depart.depart_delete),#http://127.0.0.1:8000/depart/2/edit/path('depart/<int:nid>/edit/', depart.depart_edit),path('user/list/', user.user_list),path('user/add/', user.user_add),path('user/<int:nid>/edit/', user.user_edit),path('user/<int:nid>/delete/', user.user_delete),path('pretty/list/', pretty.pretty_list),path('pretty/add/', pretty.pretty_add),path('pretty/<int:nid>/edit/', pretty.pretty_edit),path('pretty/<int:nid>/delete/', pretty.pretty_delete),path('admin/add/', admin.admin_add),path('admin/list/', admin.admin_list),path('admin/<int:nid>/edit/',admin.admin_edit),path('login/account/',account.login),      #这个是登录的
]

在写登录的视图函数account.py
我把不同模块的视图函数拆分了,不同功能模块的一个py文件,在app01目录下创建目录views, 在views目录下分类写视图函数,主要要把原始的views.py文件删除
登录使用的Form组件
获取到用户输入的数据后要对数据进行校验,根数据库里面的值
再有如果验证通过要request.session 通过这个生成session, django会自动处理,生成一个session保存到数据库,并把这个session返回给浏览器。

from django.shortcuts import render,redirect
from django import forms
from app01.utils.encrypt import md5
from app01 import modelsclass LoginForm(forms.Form):username = forms.CharField(label="用户名",widget=forms.TextInput,required=True,)passwd = forms.CharField(label="密码",widget=forms.PasswordInput(render_value=True),required=True)# 这个init方式是给自己加样式的def __init__(self, *args,**kwargs):super().__init__(*args,**kwargs)for name ,field in self.fields.items():#字段中有属性,保留原来的属性,没有属性,才增加if field.widget.attrs:field.widget.attrs["class"] = "form-control"field.widget.attrs["placeholder"] = field.labelelse:field.widget.attrs = {"class":"form-control"}def login(request):"""用户登录"""if request.method == 'GET':form = LoginForm()return render(request,'login.html',{'form':form})form = LoginForm(data=request.POST)if form.is_valid():#print(form.cleaned_data)   #获取到的值是一个字典{'username': 'root', 'passwd': '1234'}#校验数据库的用户名和密码admin_object = models.Admin.objects.filter(**form.cleaned_data).first()if not admin_object:form.add_error('passwd','用户名或密码错误')return render(request,'login.html',{'form':form})#用户名和密码正确#网站生成随机字符串; 写到用户浏览器的cookie中,再写入到session中request.session['info'] = {'id':admin_object.id,'name':admin_object.username}return redirect('/admin/list/')return render(request,'login.html',{'form':form})

login.html 的内容

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"><style>.account {width: 400px;border-radius: 5px;border: 1px solid #dddddd;box-shadow: 5px 5px 20px #aaa;margin-left: auto;margin-right: auto;margin-top: 100px;padding: 20px 40px;}.account h2 {margin-top: 10px;text-align: center;}</style>
</head>
<body>
<div class="account"><h2>用户登录</h2><form  method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label >{{ field.label }}</label>{{ field }}<span style="color:red">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提交</button></form></div><script src="{% static 'js/jquery-3.7.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>

3、中间件实现登录鉴权

在开始我们写了一个功能后,把django项目运行起来,直接方法url就能访问到了,正常来说是只有登录后的用户才能访问到,django中给我们提供了中间件,可以通过中间件来实现鉴权

在这里插入图片描述
在django 中可以定义多个中间件,中间件就是一个类,类里面定义有两个函数一个是process_request进入的,穿过所有的中间件到达视图函数,视图函数返回结果通过process_response函数返回给浏览器

  • 定义中间件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirectclass AuthMiddleWare(MiddlewareMixin):"""中间件判断是否登录"""def process_request(self,request):# 1、排除那些不需要登录就能访问的页面# request.path_info  获取当前用户请求的URL  ru /login/account/if request.path_info == '/login/account/':return# 2、读取当前访问的用户的session信息,如果能读到,说明以登录过,就可以继续向后走info_dict = request.session.get("info")if info_dict:return# 3、没有登录过,重新回到登录页面return redirect('/login/account/')
  • 使用中间件,在settings.py中注册中间件
    会按这个顺序执行,中间件定义好后,会自动调佣
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','app01.middleware.auth.AuthMiddleWare',
]

中间件添加好后,你再没有登录的情况下去访问http://127.0.0.1:8000/user/list/ 这些页面会自动跳转到登录界面。

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

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

相关文章

勘探开发人工智能技术:机器学习(4)

0 提纲 5.1 半监督学习 5.2 主动学习 5.3 代价敏感学习 5.4 多标签学习 5.5 多示例学习 1 半监督学习 用无标签的数据提升学习器的效果. 1.1 基本概念 半监督学习强调的是一种学习场景, 在该场景下, 无标签数据可以协助带标签数据提升预测质量. 监督学习: 训练数据都有标签…

【AndroidStudio】新版本Androidstudio logcat过滤设置

新版本的过滤没有以前简洁&#xff0c;但是功能性更全了&#xff1b;老版本的只能过滤一个包名&#xff0c;或一个TAG&#xff0c;或关键字&#xff0c;新版本按需过滤即可&#xff0c;下面说一下过滤的具体使用 1.按包名过滤&#xff1a; //输入package:&#xff08;输入一个…

如何将Linux上的cpolar内网穿透设置成 - > 开机自启动

如何将Linux上的cpolar内网穿透设置成 - > 开机自启动 文章目录 如何将Linux上的cpolar内网穿透设置成 - > 开机自启动前言一、进入命令行模式二、输入token码三、输入内网穿透命令 前言 我们将cpolar安装到了Ubuntu系统上&#xff0c;并通过web-UI界面对cpolar的功能有…

【福建事业单位-推理判断】02图形推理(数量-空间重构)

【福建事业单位-推理判断】02图形推理&#xff08;数量-空间重构&#xff09; 一、数量规律1.1点&#xff08;交点、切点&#xff09;点的细化考法总结 1.2线条&#xff08;线条的数量&#xff09;线的细化考点一笔画&#xff08;重点&#xff09;一笔画的判定 总结 1.3 面面的…

设计方法编写测试用例---思路分析

测一四年我在YX公司带测试团队&#xff0c;一个用例评审的会议上&#xff0c;一不小心超常发挥&#xff0c;结果卡在了一个用例设计方法上&#xff0c;印象非常深刻&#xff0c;当时的业务场景是支付方式的选择和优惠方案。 在后来的工作中&#xff0c;也曾几次遇到需要选择合…

勘探开发人工智能技术:机器学习(3)

0 提纲 4.1 logistic回归 4.2 支持向量机(SVM) 4.3 PCA 1 logistic回归 用超平面分割正负样本, 考虑所有样本导致的损失. 1.1 线性分类器 logistic 回归是使用超平面将空间分开, 一边是正样本, 另一边是负样本. 因此, 它是一个线性分类器. 如图所示, 若干样本由两个特征描…

matplotlib 笔记 plt.grid

用于添加网格线 主要参数 visible 布尔值&#xff0c;True表示画网格 which表示要显示的刻度线类型&#xff0c;可以是 major&#xff08;主刻度&#xff09;或 minor&#xff08;次刻度&#xff09;&#xff0c;或者同时显示&#xff08;both&#xff09;alpha 透明度 …

【Git】Git切换地址

如何切换git代码地址&#xff1f; 1、查看当前远程 url git remote -v执行命令后&#xff0c;可以看见当前有2个URL。 远程 URL 在一般情况下有两个&#xff0c;分别是 fetch 和 push。 fetch URL 是用于从远程仓库获取最新版本的数据。当您运行 git fetch 命令时&#xf…

xxx酒业有限责任公司突发环境事件应急预案WORD

导读&#xff1a;原文《xxx酒业有限责任公司突发环境事件应急预案word》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 目 录 1 总则 1.1 编制目的 1.2 编制…

Spring Boot集成EasyPoi实现导入导出操作

文章目录 Spring Boot集成EasyPoi实现导入导出操作0 简要说明1 环境搭建1.1 项目目录1.2 依赖管理2.3 关于swagger处理2.4 关于切面处理耗时1 自定义注解2 定义切面类3 如何使用 2.5 核心导入操作2.6 核心导出操作 2 最佳实线2.1 导入操作1 实体类说明2 业务层3 效果3 控制层 2…

使用乐观锁解决超卖问题

目录 什么是超卖&#xff1f; 乐观锁和悲观锁的定义 悲观锁&#xff1a; 乐观锁&#xff1a; 乐观锁的实现方式 1.版本号 2.CAS法 什么是超卖&#xff1f; 举个例子&#xff1a;订单系统中&#xff0c;用户在执行下单操作时&#xff0c;可能同一时间有无数个用户同时下单&…

Qt应用开发(基础篇)——框架类 QFrame

一、前言 QFrame继承于QWidget&#xff0c;被QLCDNumber、QToolBox、QLabel、QListView等部件继承&#xff0c;是一个拥有矩形框架的基类。 QFrame可以直接创建成一个没有内容的的矩形框架&#xff0c;框架的样式由边框厚度(lineWidth)、框架形状(QFrame::Shape)和阴影样式(QFr…