12 django管理系统 - 注册与登录 - 登录
为了演示方便,我就直接使用models里的Admin来演示,不再创建用户模型了。
ok,先做基础配置
首先是在base.html中,新增登录和注册的入口
<ul class="nav navbar-nav navbar-right"><li><a href="/account/login/">登录</a></li><li><a href="/account/register/">注册</a></li><li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"aria-expanded="false">Dropdown <span class="caret"></span></a><ul class="dropdown-menu"><li><a href="#">Action</a></li><li><a href="#">Another action</a></li><li><a href="#">Something else here</a></li><li role="separator" class="divider"></li><li><a href="#">Separated link</a></li></ul></li>
</ul>
接着去配置URL路径
urlpatterns = [# 部门管理path("dept/list/", dept.dept_list),path("dept/add/", dept.dept_add),path("dept/<int:nid>/edit_detail/", dept.dept_editdetail),path("dept/<int:nid>/delete/", dept.dept_delete),path("dept/search/", dept.dept_search),# 管理员管理path("admin/list/", admin.admin_list),path("admin/add/", admin.admin_add),# 登录path("account/login/", account.account_login),path("account/register/", account.account_register),]
去my_views文件夹下创建account视图,接着定义account_login方法和account_register方法
# 登录
def account_login(request):pass# 注册
def account_register(request):pass
现在开始进入登录模块的编写
我们让account_login去渲染account_login.html
# 登录
from django.shortcuts import renderdef account_login(request):return render(request, "account_login.html")
然后在templates文件下下新建account_login.html,在bootstrap官网随便扒拉一个表单改改。
{% load static %}<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录界面</title><!--引入css样式--><link rel="stylesheet" href="{% static '/plugin/bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"></link><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;}.login-container {background-color: white;padding: 20px;border-radius: 5px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}.login-container h2 {margin-bottom: 20px;}.form-group {margin-bottom: 15px;}.form-group label {display: block;margin-bottom: 5px;}.form-group input {width: 100%;padding: 10px;border: 1px solid #ddd;border-radius: 4px;}.form-group input[type="submit"] {background-color: #5cb85c;color: white;border: none;cursor: pointer;}.form-group input[type="submit"]:hover {background-color: #4cae4c;}</style>
</head>
<body>
<div class="account"><h2>用户登录</h2><form><div class="form-group"><label for="exampleInputText">用户名:</label><input type="email" id="exampleInputText" class="from-control" placeholder="用户名"></div><div class="form-group"><label for="exampleInputPassword">密码:</label><input type="password" id="exampleInputPassword" class="from-control" placeholder="密码"></div><div class="form-group"><input type="submit" value="登 录" class="btn btn-primary"></div></form>
</div>
</body>
</html>
界面如下:

页面显示出来之后,那么就可以进行表单内容验证部分的。
我们使用ModelForm来实现
首先,我们创建一个AccountModelForm,继承BootStrapModelForm。
因为我们只要Admin里的name和password,不需要sex,所以设置一下字段。
class AccountModelForm(BootStrapModelForm):class Meta:model = models.Adminfields = ["name", "password"]
接着就去取定义业务逻辑:
GET 请求: 创建一个空的 AccountModelForm实例。 将表单实例传递给 account_login.html 模板进行渲染,以便用户输入信息。
POST 请求: 使用 POST 数据创建 LoginForm 实例并验证数据。 验证通过后: 获取用户名和密码。 查询数据库,验证用户名和密码是否匹配。 匹配成功,则设置 session 并返回登录成功提示。 验证不通过: 返回带有错误信息的登录页面。
def account_login(request):if request.method == 'GET':form = AccountModelForm()context = {"form": form}return render(request, "account_login.html", context)form = AccountModelForm(data=request.POST)if form.is_valid():name = form.cleaned_data.get("name")password = form.cleaned_data.get("password")print(name, password)return HttpResponse("登录成功")else:return HttpResponse("登录失败")
因为表单数据没有进行数据库查询,我随便输入一下用户和密码看看能不能显示登录成功

可以看到能够进入表单验证阶段。
接下来是要编写account_login的表单验证业务逻辑。然后就去是数据库里找数据,判断是否在数据库中存在。
def account_login(request):"""处理用户登录请求。参数:- request: HttpRequest对象,包含登录请求的数据。返回:- HttpResponse对象,表示登录结果或渲染的登录表单。"""# 判断请求方法,GET请求表示用户希望看到登录页面if request.method == 'GET':# 初始化登录表单对象form = AccountModelForm()# 构建上下文,将表单传递给模板以渲染登录页面context = {"form": form}# 返回渲染后的登录页面return render(request, "account_login.html", context)# 非GET请求视为登录尝试,使用POST数据初始化表单对象form = AccountModelForm(data=request.POST)# print(".........", form) 用于调试的打印语句,输出表单数据# 验证表单数据有效性if form.is_valid():# 获取验证后的用户名和密码name = form.cleaned_data.get("name")password = form.cleaned_data.get("password")# 打印用户名和密码,用于调试print(name, password)# 在数据库中查询匹配的用户对象obj = models.Admin.objects.using("default").filter(name=name, password=password).first()# 如果查询结果为空,返回错误信息if not obj:return HttpResponse("用户名或密码错误")# 登录成功,返回成功信息return HttpResponse("登录成功")# 表单数据无效,重新渲染登录页面并显示错误信息return render(request, "account_login.html", {"form": form})
如果我随便输入数据,那么会提示用户名或者密码错误

我们去数据库中找一个存在的进行表单验证看看



可以看到,明显是可以登录成功。
接下来,我们还要保存session,为用户下次登录做准备。
我们先进navicat看一下session表,是空的。

然后修改account_logind的业务逻辑,保存session
def account_login(request):if request.method == 'GET':form = AccountModelForm()context = {"form": form}return render(request, "account_login.html", context)form = AccountModelForm(data=request.POST)# print(".........", form)if form.is_valid():name = form.cleaned_data.get("name")password = form.cleaned_data.get("password")print(name, password)obj = models.Admin.objects.using("default").filter(name=name, password=password).first()if not obj:return HttpResponse("用户名或密码错误")# 保存sessionrequest.session["user_info"] = {"id": obj.id, "name": obj.name} # 设置sessionprint('request.session["user_info"]...is', request.session["user_info"])# return HttpResponse("登录成功")# 返回管理员列表return redirect('/admin/list')return render(request, "account_login.html", {"form": form})
我们尝试登录一下,看看登录后是否跳转到管理员列表,并且看看session是否保存。
用户名:Kong Sze Yu,密码:Nd2ZeMwBhx


我们去navicat看看session

相关文章:
12 django管理系统 - 注册与登录 - 登录
为了演示方便,我就直接使用models里的Admin来演示,不再创建用户模型了。 ok,先做基础配置 首先是在base.html中,新增登录和注册的入口 <ul class"nav navbar-nav navbar-right"><li><a href"/ac…...
2020年计算机网络408真题解析
第一题: 解析:OSI参考模型网络协议的三要素 网络协议的三要素:语法 ,语义,同步(时序) 语法:定义收发双方所交换信息的格式 语法:定义收发双方所要完成的操作 网页的加载 …...
速盾:cdn高防服务器防火墙的特性是什么?
CDN高防服务器防火墙是一种专门为互联网应用提供安全防护的网络安全设备。它采用先进的技术和算法,通过对网络流量进行过滤和检测,以防止恶意攻击和非法访问,保障网络服务的可用性和安全性。CDN高防服务器防火墙的特性主要包括以下几个方面&a…...
小程序分包和预加载
一、目的 分包的目的: 提升小程序的首屏加载速度,其原理和PC端网页的路由懒加载非常类似。即当我们第一个打开一个小程序的时候,只加载主包以及一些公共的资源,当调到某个页面的时候,在加载该页面所在的分包…...
【MATLAB 串口调试+虚拟串口测试】
文章目录 前言一、matlab 串口二、测试串口1.从系统中获取串口号2.避免串口打开被占用3. 安装虚拟串口4. 打开串口助手和MATALB 进行测试 总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要: 提示:以下是本篇文章正文…...
mac 安装最新版nginx
1. clone最新版本源代码: git clone https://github.com/nginx/nginx.git 2. 下载PCRE 没有PCRE那我们就下,下载地址:https://sourceforge.net/projects/pcre/files/pcre/,笔者下载的pcre-8.45.zip,下载之后解压到ngi…...
极氪汽车困局:营销频繁车、产品力不足
“ 极氪汽车的“车上吃火锅”营销活动虽登上热搜,但因频繁忽视老用户和产品力不足的争议,并未赢得消费者好感,反而加剧负面印象。 ” 科技新知 原创 作者丨颜瞾 编辑丨蕨影 近日,背靠吉利集团的极氪…...
Icecream 与 Python 日志库及性能分析整合指南
简介 Icecream 是一个用于简化 Python 调试过程的库,它允许开发者轻松打印变量名和它们的值。Python 的 logging 库则提供了一个强大的日志记录系统,用于跟踪应用程序的运行情况。而性能分析则是评估代码执行效率的重要手段。本指南将介绍如何将 Icecre…...
请解读下面的程序:pat =re.compile(r‘\d+‘)res = pat.search(‘www.ddd996.com‘)res.group()
请解读下面的程序: pat re.compile(r\d) res pat.search(www.ddd996.com) res.group() 这段程序使用了正则表达式模块re来搜索字符串中的数字。首先,通过re.compile函数创建了一个正则表达式对象pat,该正则表达式是r\d,意味着匹…...
Fibonacci任意一位的值得算法
csDP写法 using System; class Program {static void Main(string[] args){Console.WriteLine("请输入一个非负整数:");// 读取用户输入while(true){string input Console.ReadLine();int n Convert.ToInt32(input);if (n < 0){Console.WriteLine(&…...
gbn,sr和tcp的区别
这是关于三种不同协议(GBN、SR、TCP)处理传输时序和丢包的行为比较。我们可以分别填充并解释它们的处理机制: GBN(Go-Back-N)协议: 类型发送方的计时器保存的是啥接收方收到失序的分组怎么办超时的时候发…...
FastGPT本地开发 之 通过Navicat管理MongoDB、PostgreSQL数据库
1. 背景 前期已经完成FastGPT的本地化部署工作,通过Docker启动FastGPT的相关容器即可运行。(共6个容器) 2.本地化开发 2.1 前置依赖 2.2 源码拉取 git clone gitgithub.com:labring/FastGPT.git2.3 数据库管理 本地化运行的FastGPT使用…...
hardhat部署智能合约
Hardhat安装 安装node 可以使用 nvm 安装node GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions 安装Hardhat 打开命令行工具,输入: mkdir hardhat-demo cd hardhat-demo npm i…...
界面控件DevExtreme中文教程 - 如何与Amazon S3和Azure Blob存储集成?
DevExtreme拥有高性能的HTML5 / JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NET Core,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,…...
【ERROR】ubuntu source: not found
Ubuntu 24.04.1 LTS系统设置环境变量,执行 source ~/.bashrc出现错误: source command not found 解决方案:不需要处理( echo 以下你的环境变量,发现是生效的),ubantu系统 中 /bin/sh 通常链接到 dash,这…...
聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项
目录 一、IOC容器的刷新环节快速回顾 二、postProcessBeanFactory源码展示分析 (一)模版方法postProcessBeanFactory (二)AnnotationConfigServletWebServerApplicationContext 调用父类的 postProcessBeanFactory 包扫描 …...
配置nginx服务通过ip访问多网站
过程概要 1.前提配置 关防火墙 关selinux 2.安装web服务程序nginx 3.查看nginx是否开启 4.为当前主机添加多地址(ip a) 5.自定义nginx配置文件通过多地址区分多网站 /etc/nginx/conf.d/test_ip.conf server { #标记为一个虚拟主机 } 6.根据配置…...
银河麒麟V10设置QT开发程序开机自启动
1、切换root用户: su root 2、进入/etc/xdg/autostart目录: cd /etc/xdg/autostart 3、创建一个test.desktop文件,文件名不一定命名为test,可以自己随意命名: touch test.desktop 4、完善test.desktop文件内容: …...
RabbitMQ高级特性详解
前言 RabbitMQ是一款广泛使用的开源消息队列软件,它基于AMQP(Advanced Message Queuing Protocol)标准实现。本文将带你深入了解RabbitMQ的一些高级特性,包括消息确认、死信队列、延迟队列、事务处理以及消息分发策略等ÿ…...
提升泛化能力的前沿方法:多任务学习在机器学习中的应用与实践
提升泛化能力的前沿方法:多任务学习在机器学习中的应用与实践 📋 目录 🧩 多任务学习的概念与动机🌐 多任务学习在自然语言处理中的应用案例🖼️ 多任务学习在计算机视觉中的应用案例⚙️ 项目实践:实现多…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
