django实现用户的注册、登录、注销功能
创建django项目的步骤:Django项目的创建步骤-CSDN博客
一、前置工作
配置数据库,设置数据库引擎为mysql
1、在settings文件中找到DATABASES, 配置以下内容
DATABASES = {"default": {'ENGINE': 'django.db.backends.mysql', # 数据库引擎'NAME': 'django_test', # 连接的数据库, 一定要存在'HOST': '127.0.0.1', # mysql的ip地址, 这里是本地'PORT': 3306, # mysql的默认端口'USER': 'root', # mysql的用户名'PASSWORD': 'xxx' # mysql的密码}
} 可能会提示以下内容:

安装即可: pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
二、编写用户模型
django中使用ORM来存数据到数据库
ORM模型(对象关系映射):
一个 模型类对应数据库中的一张表
一个属性对应数据库中的一个字段
用户表的字段:用户名、密码(可以自己扩展)
1、用户模型
2、创建好模型后要执行迁移数据的命令:
生成迁移文件:python manage.py makemigrations
迁移生效(同步到数据库):python manage.py migrate
3、迁移成功后,migrations文件夹下会出现迁移文件,该文件记录着模型的相关信息,001表示第一次迁移.
三、编写表单校验,以注册表单校验为例
使用django自带的Form类来实现校验
1、对字段的校验,这里只截了用户名的校验,其他字段都差不多

2、对整个表单的校验:
User需要从models.py文件中导入

3、form表单中自定义的其他方法:

四、编写前端页面,纯html,文件写在templates文件夹中
使用了模板的方式嵌入数据
超链接的跳转连接:{% url "命名空间:路由的name值" %},有命名空间一定要标注命名空间,没有则:{% url "路由的name值" %}
1、index.html
2、register.html
form.non_field_errors:表当校验时,表单的错误,就是forms.py文件中的
raise forms.ValidationError("错误信息")。
form.errors.username: 表单校验时,用户名的错误,就是forms.py文件中的error_messages信息,密码校验也是如此。
3、login.html
五、编写视图类来实现登录、注册功能
如果是get请求就执行get方法,是post请求就执行post方法,在form标签中的methos方法中可以指定。
form.is_valid():用来校验表单,校验成功返回True, 失败则返回False。
post的方法的实例化表单对象:实例化表单对象时一定要加request.POST,否则拿不到数据。
redirect: 重定向到其他视图函数。
form对象:实例化表单对象,用来进行表单的各种存在,校验,错误信息等待
request.session['username'] = request.POST['username']: 设置session值为用户名(其他值也可以)
六、编写首页和注销视图函数
1、首页函数
request.session.get():通过注册时设置的session中来获取用户,通过这个判断是否有登录的用户,可以与前端交互,有的话就显示注销,没有的话显示注册和登录
2、注销函数
清除session值即可
七、编写路由
1、在主路由中include分路由,并设置命名空间
命名空间:当有多个应用时建议用, 能更好的区分各个应用,使用namespace关键字设置
2、在app下创建一个urls.py文件,编写以下内容
注意:一定要加app_name, 视图类一定要加.as_view()
八、django自带的管理后台
使用python manage.py createtsuperuser创建超级用户
1、在admin.py文件中注册模型
list_display:在后台管理中要显示的字段
admin.site.site_header:后台管理的标题
2、在模型(models.py)中添加
3、使用注册的超级用户登录
九、具体的文件
1、models.py
from django.db import modelsclass User(models.Model):# 定义变量,对应数据库的表的字段# username参数:参数1:后台管理显示的内容,参数2:最大长度, CharField类型必须指定,参数3:不能为空,参数4:唯一username = models.CharField('用户名', max_length=10, null=False, unique=True)password = models.CharField('密码', max_length=255, null=False)# create_time参数:参数2:记录数据第一次创建的时间,自动记录到数据库create_time = models.DateTimeField('注册时间', auto_now_add=True)# 设置后台管理class Meta:app_label = 'app' # 属于那个appverbose_name = '用户'verbose_name_plural = verbose_name# 输出对象时用到的def __str__(self):return self.username
2、forms.py
from django import forms
from .models import Userclass RegisterForm(forms.Form):# 用户名username = forms.CharField(required=True, # 不能为空,必须max_length=10, # 最大长度min_length=4, # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于10",'min_length': "长度不能小于4",})# 密码password = forms.CharField(required=True, # 不能为空,必须max_length=16, # 最大长度min_length=8, # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于16",'min_length': "长度不能小于8",})# 校验def clean(self):# 获取输入的用户名username = self.cleaned_data.get('username')user = User.objects.filter(username=username) # 获得一个查询集,可以理解为一个列表# 用户存在if user.exists():raise forms.ValidationError("用户已存在")return self.cleaned_data# 存入数据库def save(self):username = self.cleaned_data.get('username')password = self.cleaned_data.get('password')# 存入数据库user = User(username=username, password=password)user.save()class LoginForm(forms.Form):# 用户名username = forms.CharField(required=True, # 不能为空,必须max_length=10, # 最大长度min_length=4, # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于10",'min_length': "长度不能小于4",})# 密码password = forms.CharField(required=True, # 不能为空,必须max_length=16, # 最大长度min_length=8, # 最小长度error_messages={'required': "不能为空",'max_length': "长度不能大于16",'min_length': "长度不能小于8",})# 校验def clean(self):# 获取输入的信息username = self.cleaned_data.get('username')password = self.cleaned_data.get('password')user = User.objects.filter(username=username) # 获得一个查询集,可以理解为一个列表if user.exists():if user[0].password != password:raise forms.ValidationError("密码错误")else:raise forms.ValidationError("用户不存在")return self.cleaned_data
3、admin.py
from django.contrib import admin
from .models import User# Register your models here.
@admin.register(User)
class UserAdmin(admin.ModelAdmin):list_display = ['id', 'username', 'create_time']admin.site.site_header = 'django后台管理'
4、views.py
from django.shortcuts import render, HttpResponse, redirect
from django.views import View
from .models import User
from .forms import RegisterForm, LoginForm# Create your views here.def index(request):username = request.session.get('username', default=0) # 通过session获取用户名,给默认值防止报错user = User.objects.filter(username=username).first()return render(request, 'index.html', {'user': user})class RegisterView(View):def get(self, request):form = RegisterForm()return render(request, 'register.html', {'form': form})def post(self, request):form = RegisterForm(request.POST)if form.is_valid():form.save()return redirect('app:login')return render(request, 'register.html', {'form': form})class LoginView(View):def get(self, request):form = LoginForm()return render(request, 'login.html', {'form': form})def post(self, request):form = LoginForm(request.POST)print("登录")if form.is_valid():# 设置sessionrequest.session['username'] = request.POST['username']return redirect('app:index')return render(request, 'login.html', {'form': form})# 注销
def Logout(request):request.session.clear() # 清除sessionreturn redirect('app:index')
5、app中的urls.py
from django.urls import path
from .views import *app_name = 'app'urlpatterns = [path('', index, name='index'), # 首页path('register/', RegisterView.as_view(), name='register'), # 注册path('login/', LoginView.as_view(), name='login'), # 登录path('logout', Logout, name='logout'), # 注销
]
6、主路由urls.py
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path("admin/", admin.site.urls),path('', include('app.urls', namespace='app'))
]
7、index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>首页</title>
</head>
<body>{% if user %}<h1>欢迎{{ user.username }}进入首页!!!</h1><a href="{% url 'app:logout' %}">注销</a>
{% else %}<h1>请注册或登录</h1><a href="{% url 'app:register' %}">注册</a><a href="{% url 'app:login' %}">登录</a>
{% endif %}</body>
</html>
8、register.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册</title>
</head>
<body>
<h3>注册</h3>
<a href="{% url 'app:login' %}">登录</a>|
<a href="{% url 'app:index' %}">首页</a>
<form action="{% url 'app:register' %}" method="post">{% csrf_token %}<div><p style="color: red">{{ form.non_field_errors }}</p></div><div><lable>用户名</lable><label><input type="text" name="username"></label><p style="color: red">{{ form.errors.username }}</p></div><div><lable>密码</lable><label><input type="password" name="password"><p style="color: red">{{ form.errors.password }}</p></label></div><button type="submit">注册</button>
</form>
</body></html>
9、login.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录</title>
</head>
<body>
<h3>登录</h3>
<a href="{% url 'app:register' %}">注册</a>|
<a href="{% url 'app:index' %}">首页</a>
<form action="{% url 'app:login' %}" method="post">{% csrf_token %}<div><p style="color: red">{{ form.non_field_errors }}</p></div><div><lable>用户名</lable><label><input type="text" name="username"><p style="color: red">{{ form.errors.username }}</p></label></div><div><lable>密码</lable><label><input type="password" name="password"><p style="color: red">{{ form.errors.password }}</p></label></div><button>登录</button>
</form></body>
</html>
相关文章:
django实现用户的注册、登录、注销功能
创建django项目的步骤:Django项目的创建步骤-CSDN博客 一、前置工作 配置数据库,设置数据库引擎为mysql 1、在settings文件中找到DATABASES, 配置以下内容 DATABASES {"default": {ENGINE: django.db.backends.mysql, # 数据库引擎NAME: dja…...
【JAVA 常用API】数据库字段存储JSON格式数据,JAVA中如何将List<Entity>或者对象实体转换为字符串
在Java中,可以使用第三方库如Jackson或Gson来进行JSON的转换。这些库提供了将Java对象转换为JSON字符串的方法。 一:Gson API转Json Getter Setter NoArgsConstructor AllArgsConstructor ToString Builder public class Person {private String name;p…...
AI算不出9.11和9.9哪个大?六家大模型厂商总结了这些原因
大模型“答对”或“答错”其实是个概率问题。关于“9.11和9.9哪个大”,这样一道小学生难度的数学题难倒了一众海内外AI大模型。7月17日,第一财经报道了国内外“12个大模型8个都会答错”这道题的现象,大模型的数学能力引发讨论。 “从技术人员…...
MacBook电脑远程连接Linux系统的服务器方法
一、问题简介 Windows 操作系统的电脑可使用Xshell等功能强大的远程连接软件。通过连接软件,用户可以在一台电脑上访问并控制另一台远程计算机。这对于远程技术支持、远程办公等场景非常有用。但是MacBook电脑的macOS无法使用Xshell。 在Mac上远程连接到Windows服…...
CSS-0_3 CSS和单位
文章目录 CSS的值和单位属性值长度单位CSS和绝对单位CSS和相对单位百分比em & rem视口 颜色单位 碎碎念 CSS的值和单位 我们知道,CSS是由属性和属性值所组成的表 随着CSS的发展,属性不说几千也有几百,我从来不支持去背诵所有的可能性。…...
【代码随想录|贪心算法 455. 分发饼干 376. 摆动序列 53. 最大子数组和】
代码随想录|贪心算法 455. 分发饼干 一、455. 分发饼干1.代码2.问题 二、376. 摆动序列1.代码 三、53. 最大子数组和1.代码 总结 python 一、455. 分发饼干 455. 分发饼干 1.代码 代码如下(示例): class Solution:def findContentChildr…...
swift小知识点(二)
1、 Swift 枚举 Swift 中使用 enum 关键词来创建枚举并且把它们的整个定义放在一对大括号内: enum enumname {// 枚举定义放在这里 } 如下事例: // 定义枚举 enum DaysofaWeek {case Sundaycase Mondaycase TUESDAYcase WEDNESDAYcase THURSDAYcase…...
机器人产业发展格局多元化,创业公司突破瓶颈需多维施策
当前,机器人产业的发展格局呈现出多元化、快速增长和技术不断创新的特点。从全球视角来看,机器人市场持续增长,预计到2026年全球人形机器人市场规模将超过20亿美元,到2030年有望突破200亿美元,显示出巨大的市场潜力和发…...
接口测试JMeter-1.接口测试初识
第一章 接口测试初识 1. 接口测试理论基础 “接口测试”一个让人觉得非常高大上的名词,特别是对于刚入门的测试同学而言。随着测试技术不断的深化,“接口测试”出现在我们视野中的频次越来越高。那么接口测试到底是如何做的?接口测试的优势又…...
[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-22 TPG图像测试数据发生器设计
软件版本:Anlogic -TD5.9.1-DR1_ES1.1 操作系统:WIN10 64bit 硬件平台:适用安路(Anlogic)FPGA 实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板 板卡获取平台:https://milianke.tmall.com/ 登录“米联客”FPGA社区 ht…...
如何通过企业微信会话存档保护企业利益?
赵总: 张经理,最近行业内频发数据泄露事件,我们的客户资料和内部沟通记录安全吗? 张经理: 赵总,我们已经采取了一系列措施来加强数据安全。特别是针对企业微信的沟通记录,我们最近引入了安企神软件,它能很…...
git修改提交姓名
git config --global user.name “新用户名” git config --global user.email “新邮箱地址” 修改提交的用户名 git config --global user.name “yu***”...
5、在共享内存无指针编程:句柄HANDLE转换为指针
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 共享内存里面不能用指针&#…...
hive动态分区导致xceivercount超限,hdfs无法创建新连接
目录 一、事件复盘: 二、解决方案: 三、讨论 一、事件复盘: hdfs无法创建新的文件,xceivercount超过最大设置,平时每个datanode只有100个左右的连接,突然达到8000以上。 事故原因,跨多天的…...
如何识别Android init 中的缓慢操作
Android 14 开机时间优化措施汇总-CSDN博客 Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客Android系统设置kernel log level的…...
JVM:常用工具总结
文章目录 一、jstat工具 一、jstat工具 Jstat工具是JDK自带的一款监控工具,可以提供各种垃圾回收、类加载、编译信息等不同的数据。使用方法为:jstat -gc进程ID每次统计的时间间隔(毫秒)统计次数。 C代表Capacity容量,…...
二染色,CF 1594D - The Number of Imposters
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1594D - The Number of Imposters 二、解题报告 1、思路分析 并查集&…...
Go语言并发编程-Channel通信_2
Channel通信 Channel概述 不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存 这是Go语言最核心的设计模式之一。 在很多主流的编程语言中,多个线程传递数据的方式一般都是共享内存,而Go语言中多Goroutine通信的主要方案是Cha…...
Richteck立锜科技电源管理芯片简介及器件选择指南
一、电源管理简介 电源管理组件的选择和应用本身的电源输入和输出条件是高度关联的。 输入电源是交流或直流?需求的输出电压比输入电压高或是低?负载电流多大?系统是否对噪讯非常敏感?也许系统需要的是恒流而不是稳压 (例如 LED…...
Socket 简介与 Java Socket 编程示例
Socket(套接字)是网络通信中的一个关键概念,它是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。 一、定义与概念 基本概念:Socket可以被视为网络环境中进程间通信的API(应用程序编程接口)&…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
