[django项目] 实现用户登录登出功能

article/2025/8/20 16:41:33

用户登录登出功能

I. 功能需求分析

1>功能分析

1.1>流程图

[外链图片转存失败(img-Fvz7ob4M-1565741008283)(用户登录登出功能.assets/登录注册流程图 (2)]-1562769060760.png)

1.2>功能接口

  1. 登录页面
  2. 登录功能
  3. 退出功能

II. 登陆页面

1>接口设计

1.1>接口说明

类目说明
请求方法GET
url定义/users/login/
参数格式无参数

1.2>返回结果

登陆页面

2.后端代码

  1. user/views.py代码:

    from django.shortcuts import render
    from django.views import View
    # ....class LoginView(View):"""登录视图"""def get(self, request):return render(request, 'users/login.html')
    
  2. user/urls.py代码:

    from django.urls import path, include
    from . import views
    app_name = 'users'urlpatterns = [path('register/', views.RegisterView.as_view(), name='register'),path('login/', views.LoginView.as_view(), name='login'),
    ]
    

3.前端页面代码

1.users/login.html

因为表单需要post请求,所以记得在页面使用{% csrf_token %}标签。

注册功能已经开发好了,所以页面的上的立即注册处的a标签href可以写好

{% extends 'base/base.html' %}
{% load static %}{% block title %}登录{% endblock title %}
{% block link %}<link rel="stylesheet" href="{% static 'css/users/auth.css' %}">
{% endblock link %}{% block main_start %}<!-- container start -->
<main id="container"><div class="login-contain"><div class="top-contain"><h4 class="please-login">请登录</h4><a href="{% url 'users:register' %}" class="register">立即注册 &gt;</a></div><form action="" method="post" class="form-contain"><div class="form-item"><input type="tel" placeholder="请输入用户名或手机号" name="account" class="form-control" autocomplete="off"></div><div class="form-item"><input type="password" placeholder="请输入密码" name="password" class="form-control"></div><div class="form-item clearfix"><label><input type="checkbox" name="remember"><span>记住我</span></label><a href="javascript:void(0);" class="forget-password">忘记密码?</a></div><div class="form-login"><input type="submit" value="登录" class="login-btn"></div>{% csrf_token %}</form></div>
</main>
<!-- container end -->
{% endblock main_start %}

III. 登录功能

1>业务流程分析

  1. 参数校验
    1. 账户校验(用户名/手机号)
    2. 密码校验
    3. 账户密码联合校验
  2. 登陆逻辑
    1. 登陆就是在session中保存状态
    2. 根据记住我选项, 设置sessionID有效期

2>接口设计

2.1>接口说明:

类目说明
请求方法POST
url定义/users/login/
参数格式表单参数

2.2>参数说明:

参数名类型是否必须描述
account字符串用户输入的手机号或用户名
password字符串用户输入的密码
remember字符串用户是否选择免登录

2.3>返回结果:

{"errno": "0", "errmsg": "OK", 
}

虽然登陆功能简单, 但安全需求极高, 需要考虑到的底层的东西很多, 所有这里我们可以使用django内置的auth模块来实现, 目的追求的是快速开发, 不深入底层

3>后端代码

3.1>users/views.py视图

在users目录下的views.py文件中定义如下视图:

class LoginView(View):"""登录视图"""def get(self, request):return render(request, 'user/login.html')def post(self, request):# 1.校验参数form = LoginForm(request.POST, request=request)if form.is_valid():# 2.登录功能return json_response(errmsg='恭喜登录成功!')else:# 引发的错误可能会有多条错误信息,如果出错了,就将表单的报错信息进行拼接,err_msg_list = []for item in form.errors.values():# 遍历的item也是一个列表, 其中的第一个元素是报错信息err_msg_list.append(item[0])err_msg_str = '/'.join(err_msg_list)# 由于是参数错误, 所以使用Code.PARAMERRreturn json_response(errno=Code.PARAMERR, errmsg=err_msg_str)

3.2>users/forms.py表单

在user目下的forms.py文件中定义如下表单:

import refrom django import forms
from django.db.models import Q
from django.contrib.auth import loginfrom users.models import User
from .constants import USER_SESSION_EXPIRYclass LoginForm(forms.Form):# 由于不确定是手机号码还是用户名,而这两者的格式是不一样的,所以要单独校验account = forms.CharField(error_messages={'required': '账户不能为空'})password = forms.CharField(max_length=20, min_length=6,error_messages={'max_length': '密码长度要小于20','min_length': '密码长度要大于6','require': '密码不能为空'})remember = forms.BooleanField(required=False)def __init__(self, *args, **kwargs):    # 在不清楚有什么具体参数的情况下,可使用这种方式代替self.request = kwargs.pop('request', None)    # 将接收到的request从参数中剔除出来,然后赋值# 执行完成上面的操作后再去执行父类的init,从而不会破环父类的初始化super().__init__(*args, **kwargs)def clean_account(self):"""校验用户账户:return:"""account = self.cleaned_data.get('account')if not re.match(r'^1[3-9]\d{9}$', account) and (len(account)<5 or len(account)>20):raise forms.ValidationError('用户账户格式不正确,请重新输入')# 一定要returnreturn accountdef clean(self):"""校验用户名密码,并实现登录逻辑:return:"""clean_data = super().clean()# 拿到参数account = clean_data.get('account')password = clean_data.get('password')remember = clean_data.get('remember')# 实现登陆逻辑# 判断用户名与密码是否匹配# 1. 先找到这个用户, 使用以下代码来试下这一句sql语句# select * from tb_users where mobile=account or username=account;user_queryset = User.objects.filter(Q(mobile=account) | Q(username=account))if user_queryset:# 2. 校验是否匹配'user = user_queryset.first()if user.check_password(password):# 3. 是否免密登陆if remember:# 免密登陆14天self.request.session.set_expiry(USER_SESSION_EXPIRY)else:# 关闭浏览器就重置登陆状态self.request.session.set_expiry(0)# 4. 登录login(self.request, user)else:raise forms.ValidationError('用户名密码错误!')else:raise forms.ValidationError('该账户不存在,请重新输入!')return clean_data

在user文件加下创建constants.py文件定义如下常量

# 用户session信息过期时间 单位秒 默认14天
USER_SESSION_EXPIRY = 14*24*60*60

4>前端代码

修改user/login.html中用户账户输入框input的name为account

在static/js/user/下创建login.js文件

js代码如下:

$(function () {// 首先拿掉登录按钮原有的提交功能let $loginBtn = $('.login-btn');    // 获取登录按钮元素$loginBtn.click(function (e) {e.preventDefault(); // 阻止默认提交// 其次校验表单数据// 1.校验账户let sAccount = $('input[name="account"]').val();if (sAccount === ''){message.showError('用户账户不能为空');return}if(!(/^\w{5,20}$/).test(sAccount) && !(/^1[3-9]\d{9}$/).test(sAccount)){message.showError('用户账户格式不正确,请求重新输入');return}// 2.校验用户输入密码let sPassword = $('input[name="password"]').val();if(sPassword === ''){message.showError('用户密码不能为空');return}// 3.获取用户是否勾选'记住我',勾选为true,否则为falselet bRemember = $('input[name="remember"]').is(':checked');// 然后发送ajax请求$.ajax({url: '/users/login/',data: {account: sAccount,password: sPassword,remember: bRemember},type: 'POST',dataType: 'json',success: function (res) {if(res.errno === '0'){message.showSuccess('恭喜, 登录成功!');setTimeout(function () {//注册成功之后重定向到打开登录页面之前的页面,document.referrer表示前一个的页面if(!document.referrer || document.referrer.includes('/users/login/') || document.referrer.includes('/users/register/')){// 如果没有前一个页面(即直接通过登录页面的url访问的),// 或是前一个页面就是登录页面(原地刷新),// 或是前一个页面是注册页面(先注册后登陆),// 那么将直接跳转到主页面window.location.href = '/'}else {// 如果是通过其他界面来到登录的, 那就跳回前一个的页面window.location.href = document.referrer}}, 3000)}else{message.showError(res.errmsg)}},error: function (xhr, msg) {message.showError('服务器超时,请重试')}});});
});

5>页面效果

在这里插入图片描述

IIII. 登出功能

1>接口设计

接口说明:

类目说明
请求方法GET
url定义/user/logout/
参数格式无参数

2>后端代码

# 在user目录下的views.py文件中定义如下视图:
class LogoutView(View):"""登出视图"""def get(self, request):logout(request)return redirect(reverse('users:login'))
# 在urser目录下的urls.py文件定义如下路由:
from django.urls import path
from . import views
app_name = 'users'urlpatterns = [path('register/', views.RegisterView.as_view(), name='register'),path('login/', views.LoginView.as_view(), name='login'),path('logout/', views.LogoutView.as_view(), name='logout'),
]

3>前端代码

修改templates/base/base.html中的header部分的代码如下

通过is_authenticated确定当前登录状态, 然后if判断,

如果已登录则展示?‍?user.username, 如未登录则展示登录/注册

<header id="header"><div class="mw1200 header-contain clearfix"><!-- logo start --><h1 class="logo"><a href="javascript:void(0);" class="logo-title">Python</a></h1><!-- logo end --><!-- nav start --><nav class="nav">...</nav><!-- nav end --><!-- login start --><div class="login-box">{% if user.is_authenticated %}<div class="author"><i class="PyWhich py-user"></i><span>{{ user.username }}</span><ul class="author-menu"><li><a href="javascript:void(0);">后台管理</a></li><li><a href="{% url 'users:logout' %}">退出登录</a></li></ul></div>{% else %}<div><i class="PyWhich py-user"></i><span><a href="{% url 'users:login' %}" class="login">登录</a> /<a href="{% url 'users:register' %}" class="reg">注册</a></span></div>{% endif %}</div><!-- login end --></div>
</header>

4>页面效果:

在这里插入图片描述
项目源码:https://gitee.com/hao4875/newssite


http://chatgpt.dhexx.cn/article/k1GDbWMZ.shtml

相关文章

后台登录登出

后台登录登出 一&#xff0e;Session简介 在WEB开发中&#xff0c;服务器可以为每个用户浏览器创建一个会话对象&#xff08;session对象&#xff09;&#xff0c;注意&#xff1a;一个浏览器独占一个session对象(默认情况下)。因此&#xff0c;在需要保存用户数据时&#xff…

JWT 的登出问题

Jwt 使用起来不难&#xff0c;而且让我们将“无状态”的概念更贴切的展示出来了&#xff0c;但是实践就真的这么完美吗&#xff1f;不是&#xff0c;因为jwt 的登出问题。 何为登出&#xff1a;就是用户自己点击登出后&#xff0c;或用户的角色/权限改变后&#xff0c;该token…

Shiro入门之实现登录登出

概述 这里使用Shiro来实现用户的登录和登出功能。 前提&#xff1a;已经会Spring集成Shiro。即使没有下面也会提供源码&#xff0c;下面只说明Shiro部分的核心代码&#xff0c;如Mapper、Service类中的代码基本上就是从数据库中读取数据&#xff0c;而且源码有提供&#xff0…

cas5.3.2单点登录-单点登出(十一)

原文地址&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_34021712/article/details/81515317 ©王赛超 既然有单点登录,肯定就要有登出,之前的整合都是只针对了登录&#xff0c;对登出并没有关注,今天我们就来讲讲登出。 关于单点登出原理&#…

数说故事车企数字化渠道管理创新方法——精准进行消费者洞察

随着疫情带来的变化&#xff0c;原来在一二线城市的购物中心店&#xff0c;受人流量的不确定性冲击越来越大&#xff0c;但成本的支出也越来越高。因此购物中心店&#xff0c;将有可能从原来的重“集客”功能&#xff0c;变成更多的从品牌、体验出发的形象中心店&#xff0c;“…

权威报告!这五个消费趋势,告诉你如何抓住中国消费者的心和钱包

有人说2023年是消费复苏的一年&#xff0c;市场回暖趋势明显&#xff1b;也有人说之前的亏空太大&#xff0c;想要短时间追上来不太可能&#xff0c;因此2023的消费市场最多是不低迷&#xff0c;达不到火热。 这可把做生意的各位老板整纠结了&#xff0c;究竟今年要不要投个大手…

ChatGPT与数据挖掘:洞察消费者行为,优化营销策略

随着科技的不断进步和数字化时代的到来&#xff0c;企业们越来越意识到数据的重要性。在零售和电子商务行业&#xff0c;了解消费者行为并准确洞察其需求&#xff0c;是成功营销和提升业绩的关键。而现在&#xff0c;借助人工智能技术中的ChatGPT以及数据挖掘技术&#xff0c;企…

市场营销学5——消费者购买行为分析

什么是消费者购买行为 消费者购买行为是指人们为满足需要和欲望而寻找、选择、购买、使用、评价及处置产品、服务时介入的过程活动&#xff0c;包括消费者的主观心理活动和客观物质活动两个方面。 消费者购买行为分析的环节 消费者购买行为研究包括以下几个环节&#xff1a; 购…

【消费战略方法论】认识消费者的恒常原理(三):消费者刺激反馈原理

人类是一种高度智能的生物&#xff0c;而所谓智能的核心在于其理解世界的能力&#xff0c;而理解世界的过程中必然伴随着感知和反应。人的刺激反馈机制就是在这个过程中发挥着重要的作用。 刺激反馈机制是一种生物学的反应现象&#xff0c;它指的是人体对外界刺激的感知与反应…

大数据之kafka消费者

&#x1f352;今天是端午节&#xff0c;先祝大家端午节快乐&#xff01;上一期我们学习了kafka的broker部分主要介绍了kafka中的副本、kafka文件的存储的原理&#xff0c;以及kafka的高效读写的保证&#xff0c;今天我们来介绍kafka中的消费者原理&#xff0c;对往期内容感兴趣…

元年智答|数据洞察功能介绍

什么是数据洞察 随着企业积累数据量增多&#xff0c;数据分析师常常需要处理“长且宽”的数据集。依靠人的经验处理海量数据&#xff0c;从海量数据中发掘出有用的信息无异于大海捞针。虽然人工智能技术的普及和单位算力价格的下降大大降低了数据挖掘的门槛&#xff0c;但是面…

营销创意没灵感?社交媒体和消费者洞察给你答案

创意是营销的核心。 品牌需要优秀的创意营销才能吸引消费者、与受众建立联系、宣传产品与服务。 想要营销内容创作方面表现出色&#xff0c;品牌就需要源源不断的新鲜创意来抓住人们的眼球、占领消费者注意力。 在实际营销过程中&#xff0c;出海品牌常常为创意冥思苦想、绞尽…

经典消费者生产者问题

首先你需要了解多线程的流程以及实现多线程的几种方法&#xff0c;同时你要理解什么是并行、并发&#xff0c;以及线程和进程的区别&#xff0c;这里做简要的区别。 线程&#xff1a;一个进程包括多个线程 并行&#xff1a;多个cpu实例或者多台机器同时执行一段处理逻辑&#x…

【报告分享】德勤:2023中国消费者洞察与市场展望.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2022年12月份热门报告盘点 罗振宇2023年跨年演讲PPT原稿吴晓波2022年年终秀演讲PPT原稿2023年&#xff0c;如何科学制定年度规划&#xff1f; 《底层逻辑》高清配图 华为202…

2023中国消费者洞察报告

下载报告去公众号&#xff1a;硬核刘大 后台回复“ 消费者洞察”&#xff0c;即可下载完整PDF文件。 更多报告内容&#xff0c;可加微信&#xff1a;chanpin628 领取。(ps&#xff1a;加过微信&#xff1a;chanpin628 的不要再加&#xff0c;分享的内容一样&#xff0c;有一个…

大数据营销更需要消费者洞察

2013年10月17日&#xff0c;独立商业趋势观察家&#xff0c;知名中国消费趋势研究专家&#xff0c;数字营销专家肖明超先生&#xff0c;应凤凰网的邀请参加了凤凰网在广州举办的“营销人的幸福梦”主题沙龙活动&#xff0c;并与凤凰网副总裁徐进、琥珀传播CEO刘阳&#xff0c;一…

消费者消费消息分析

消费者读流程 】每个consumer都可以根据分配策略&#xff08;默认RangeAssignor&#xff09;&#xff0c;获得要消费的分区 】 获取到consumer对应的offset&#xff08;默认从ZK中获取上一次消费的offset&#xff09; 】 找到该分区的leader&#xff0c;拉取数据 】 消费者提交…

消费者详解-消费消息(1)

文章目录 消费者消费消息流程Pull消费流程1. 初始化消费者2. 拉取topic的消息队列3. 拉取消费位点4. 根据消费位点消费消息5. 保存消费进度拉取消息-pullKernelImpl Broker处理拉取消息请求1、权限、参数校验并且获取初始化变量&#xff1a;2、获取拉取消息的topic配置3、解析订…

直播报名 | 海外社交媒体趋势如何?出海品牌如何掌握消费者洞察?

近年来&#xff0c;中国品牌出海势头强劲&#xff0c;智能硬件、互联网应用、时尚服饰等正加速风靡海外市场&#xff0c;涌现出像安克创新、SHEIN这样的全球化品牌。有人提问&#xff0c;安克创新&#xff0c;凭借什么成为全球化品牌&#xff1f;出海企业可以从中借鉴什么&…

Kafka消费者不消费数据

背景&#xff1a; 工作往往是千篇一律&#xff0c;真正能学到点知识都是在上线后。使用SkywalkingKafkaES进行应用监控。 现象&#xff1a; 公司使用Skywalking在开发测试环境中Kafka顺利消费数据&#xff0c;到了UAT环境一开始还正常&#xff0c;后面接入了更多的应用后出现…