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(应用程序编程接口)&…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
