【从零开始开发一个线上网课系统-01】账号登录及退出登录功能开发

news2024/12/29 11:03:57

文章目录

    • 1 视图层开发
    • 2 form表单验证
    • 3 配置urls.py
    • 4 模板层开发

实际上在系统开发的博客中应该先描述数据库设计,但由于设计的表比较多,其理解简单,但撰写和描述较为麻烦,所以我以可视化方式来呈现这些数据表以及其中的关系,这其中包含了django内置的数据表、xadmin内置的数据表、自定义的数据表以及重写的django内置数据表,他们之间的关系如下:
在这里插入图片描述

1 视图层开发

整个视图层使用基于类的视图开发。
账号登录功能开发步骤如下:

  • GET方式访问该URL时,使用django内置参数is_authenticated,判断用户是否已经登陆过(检查cookies),若已登录则跳转至首页,反之跳转到登录界面;
  • POST方式访问时,按照如下步骤进行:
    • 使用django内置的form表单模块,验证数据是否有效,并获取表单数据,若数据无效则返回登陆页面;

    • 若表单数据不为空则使用django内置authenticate函数判断用户是否存在于数据库中;

      这里之所以使用django内置authenticate函数,而不使用user.objects.filter(username=username)的原因是:
      - 若只检查用户名或密码并不能完全查询到该用户;
      - 若同时验证用户名和密码,数据库中存储的密码为密文,用户输入的是明文,要经过一次加密才能验证,编码复杂;

    • 若查询到用户,则使用django内置的login()函数登录并使用HttpResponseRedirect()函数重定向到index界面,否则使用render()函数返回登陆页面,并回传错误信息和错误数据。

退出登录仅需要调用内置的logout()函数并重定向到主页(index.html)即可。

from django.shortcuts import render
from django.views.generic.base import View
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponseRedirect
from django.urls import reverse

from apps.operations.models import UserProfile
from apps.users.forms import LoginForm, DynamicLoginForm, RegisterGetForm, RegisterPostForm


class LogoutView(View):
    def get(self, request, *args, **kwargs):
        logout(request)
        return HttpResponseRedirect(reverse("index"))


class LoginView(View):
    def get(self, request, *args, **kwargs):
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse("index"))
        return render(request, "login.html")

    def post(self, request, *args, **kwargs):
        login_form = LoginForm(request.POST)  # 创建表单用于验证数据以及获取数据
        if login_form.is_valid():
            user_name = login_form.cleaned_data["username"]
            password = login_form.cleaned_data["password"]

            # 表单验证
            if not user_name:
                return render(request, "login.html", {"msg": "请输入用户名"})
            if not password:
                return render(request, "login.html", {"msg": "请输入密码"})
            
            # 用户查询(通过用户名和加密后的密码)
            user = authenticate(username=user_name, password=password)
            if user is not None:
                login(request, user)
                # 重定向url,调用reverse函数通过urlname来反向解析url
                return HttpResponseRedirect(reverse("index"))
            else:
                return render(request, "login.html", {"msg": "用户名或密码错误", "login_form": login_form})
        else:
            return render(request, "login.html", {"login_form": login_form})

2 form表单验证

django中自带form表单验证模块,我们只需要在forms.py文件中规定表单字段,然后在视图层中创建该表单对象并使用模块内置的is_valid()函数验证即可,验证中会若出现错误信息会放在form.errors对象中。例如:password小于6个字符,就会在form.errors.password对应的信息中提示该错误,模板层开发中会使用该参数。更多高级操作会在后续的功能开发中使用到。

注意:变量名必须与前端输入框的<name>标签保持一致。

from django import forms


class LoginForm(forms.Form):
    """
    实现表单验证功能
    """
    username=forms.CharField(required=True, min_length=2)
    password=forms.CharField(required=True, min_length=6)

3 配置urls.py

注意:配置urls时需要设置name参数,后续前端界面配置url跳转时会使用到该参数。

from apps.users.views import LoginView, LogoutView
urlpatterns = [
    path('login/', LoginView.as_view(), name="login"),  # 当前app的专属urls配置文件
    path('logout/', LogoutView.as_view(), name="logout"),
]

4 模板层开发

  1. 配置form表单提交方式为POST:method="post";配置form表单向登录url提交数据:action="{% url 'login' %}"login是urls.py配置中所设置的name参数,对应url:http://127.0.0.1:8000/login/
  2. 根据form表单验证中的报错信息高亮标注报错数据对应的输入框:在<input>标签的class属性中添加{% if login_form.errors.username %}errorput{% endif %}
  3. 显示报错信息。若form表单验证出错则显示其报错信息,否则显示视图层中回传的其余报错信息。
<div class="fl form-box">
    <h2>帐号登录</h2>
    <form action="{% url 'login' %}" method="post" autocomplete="off">
        <input type='hidden' name='csrfmiddlewaretoken' value='mymQDzHWl2REXIfPMg2mJaLqDfaS1sD5'/>
        <div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
            <label>&nbsp;&nbsp;</label>
            <input name="username" id="account_l" type="text" placeholder="手机号/邮箱"
                   value="{{ login_form.username.value }}"/>
        </div>
        <div class="form-group marb8 {% if login_form.errors.password %}errorput{% endif %}">
            <label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
            <input name="password" id="password_l" type="password" placeholder="请输入您的密码"
                   value="{{ login_form.password.value }}"/>
        </div>
        <div class="error btns login-form-tips" id="jsLoginTips">
            {% if login_form.errors %}
                {% for key, error in login_form.errors.items %}
                    {{ error }}
                {% endfor %}
            {% else %}
                {{ msg }}
            {% endif %}
        </div>
        <div class="auto-box marb38">

            <a class="fr" href="forgetpwd.html">忘记密码?</a>
        </div>
        <input class="btn btn-green" id="jsLoginBtn" type="submit" value="立即登录 > "/>
        <input type='hidden' name='csrfmiddlewaretoken' value='5I2SlleZJOMUX9QbwYLUIAOshdrdpRcy'/>
        {% csrf_token %}
    </form>
    <p class="form-p">没有慕学在线网帐号?<a href="register.html">[立即注册]</a></p>
</div>

至此登录和退出登录功能开发完成,记得修改主页(index.html)的登录跳转按键相关属性。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RISCV Reader笔记_1 RISCV的意义

RISCV Reader RISCV的诞生 出众之处 RISCV架构被设计的目的就是成为一个通用的指令集架构 ISA。不仅支持从微控制器到高性能计算机的各种处理器&#xff0c;兼容各种编程语言&#xff0c;还适应FPGA ASIC等所有实现技术&#xff0c;稳定…… 计算机体系结构为了在指令集更新…

Iceberg从入门到精通系列之一:Iceberg核心概念理解

Iceberg从入门到精通系列之一&#xff1a;Iceberg核心概念理解 一、Iceberg核心概念二、Iceberg表结构三、数据文件四、表快照Snapshot五、清单列表Manifest list六、表快照、数据文件和清单列表之间的关系七、Catalog八、Hive Catalog九、Hadoop Catalog十、Hive Catalog和Had…

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序

Alamouti,MRC以及beam三种方式的误码率对比MATLAB仿真程序 完整程序: clc; clear; close all; warning off; addpath(genpath(pwd)); %%%%%%%%%%%%%%%%%%%%%%%%% Initialization %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% N = 10^6; r_n = rand(1,N)>0.5; BPSK = 2*r_n-1; E_n_d…

chatgpt赋能python:Python生成GUI的步骤和工具

Python生成GUI的步骤和工具 Python是一种广泛使用的编程语言&#xff0c;其语法简洁、易学、可读性强等特点深受程序员喜爱。 Python的GUI编程让我们可以为用户提供友好的界面&#xff0c;帮助用户更好地理解和使用程序。Python生成GUI的过程并不复杂&#xff0c;本文将为您介…

代码随想录算法训练营第42天 | 01背包问题理论基础 + 416.分割等和子集

今日任务 目录 01背包问题 二维数组 01背包问题 一维/滚动数组 416.分割等和子集 - Medium 01背包问题 二维数组 理论基础&#xff1a;代码随想录 01 背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品…

课程18:角色权限功能实现

🚀前言 本文是《.Net Core从零学习搭建权限管理系统》教程专栏的课程(点击链接,跳转到专栏主页,欢迎订阅,持续更新…) 专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。 专栏适用于人群:We…

chatgpt赋能python:Python生成C++代码-提高生产力的利器

Python 生成 C 代码 - 提高生产力的利器 Python 作为一种高级编程语言&#xff0c;在数据分析、机器学习等领域都有着广泛的应用。但是&#xff0c;Python 被认为速度慢&#xff0c;无法处理一些高性能的任务。此时&#xff0c;C这种低级语言就被用来替代 Python&#xff0c;以…

实战:构建工具-共享库配置实践-2023.6.22(测试成功)

实战&#xff1a;构建工具-共享库配置实践-2023.6.22(测试成功) 目录 推荐文章 https://www.yuque.com/xyy-onlyone/aevhhf?# 《玩转Typora》 实验环境 gitlab/gitlab-ce:15.0.3-ce.0 jenkins/jenkins:2.346.3-2-lts-jdk11实验软件 链接&#xff1a;https://pan.baidu.com/…

Flutter Dart操作符

常见的操作符大家都知道就不多介绍了&#xff0c;主要来看看Java所没有的。 类型判定操作符 as、 is、 和 is! 操作符是在运行时判定对象 类型的操作符 操作符解释as类型转换is如果对象是指定的类型返回 Trueis!如果对象是指定的类型返回 False as 操作符把对象转换为特定的类…

如何加入开源社

开源社成立于 2014 年&#xff0c;是由志愿贡献于开源事业的个人成员&#xff0c;依 “贡献、共识、共治” 原则所组成&#xff0c;始终维持厂商中立、公益、非营利的特点&#xff0c;是最早以 “开源治理、国际接轨、社区发展、项目孵化” 为使命的开源社区联合体。开源社积极…

chatgpt赋能python:Python生成GUID:让你的代码变得更加唯一

Python生成GUID&#xff1a;让你的代码变得更加唯一 在现代软件开发领域中&#xff0c;一个核心的问题是如何确保代码生成的ID是唯一的。通过Python语言生成全球唯一标识符&#xff08;GUID&#xff09;是一个非常流行的方法&#xff0c;而且是非常容易实现的。 什么是Python…

FutureTask源码

介绍 在创建线程的方式中&#xff0c;我们可以直接继承Thread和实现Callable接口来创建线程&#xff0c;但是这两种创建线程的方式不能返回执行的结果。于是从JDK1.5开始提供了Callable接口和Future接口&#xff0c;这两种创建线程的方式可以在执行完任务之后返回执行结果。 …

Java8 LocalDateTime获取当前周是本年第几周weekOfYear,用WeekFields

Java8 LocalDateTime获取当前周是本年第几周weekOfYear, 可用WeekFields LocalDateTime 没有直接获得 weekOfYear 的方法 LocalDateTime 有一个 get(TemporalField field) 方法, 返回 int public int get(TemporalField field) {if (field instanceof ChronoField chronoFiel…

读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量

1. 停电事故后电力恢复的方式 1.1. 停电后常见的情形是&#xff0c;送电几秒钟后又再次断电 1.2. 数百万台空调和冰箱的用电需求&#xff0c;使刚刚恢复的电力供应发生过载 1.3. 当电力供应不足时&#xff0c;增加的电流很快就到达满负荷&#xff0c;导致过载&#xff0c;触…

chatgpt赋能python:Python中的点形状:了解点与其表现形式

Python中的点形状&#xff1a;了解点与其表现形式 在Python编程中&#xff0c;点是一种十分重要的形状&#xff0c;它不仅可以用来表示数据结构中的节点&#xff0c;还可以用来绘制图形。本篇文章将介绍Python中点形状的表现形式和相关知识点。 点的表现形式 在Python中&…

跨 OT 部门管理来自新兴技术的网络风险挑战

本文首发微信公众号网络研究院&#xff0c;关注获取更多。 随着 AI 和自动化工具被引入企业&#xff0c;解决这些新技术&#xff08;包括 OT 环境中的生成 AI&#xff09;带来的网络风险需要一种综合方法。 这些新兴技术进步可以在 OT&#xff08;运营技术&#xff09;基础设…

【夜深人静写数据结构与算法 | 第八篇】哈希算法与哈希表

目录 前言&#xff1a; 哈希&#xff1a; 哈希表&#xff1a; 哈希表组成&#xff1a; 哈希表实例&#xff1a; 哈希函数&#xff1a; TIPS&#xff1a; 总结 前言&#xff1a; 如果此时我要你默写一个有一百位的数字&#xff0c;你要如何做才能保证不会漏写呢&#xf…

Jenkins安装手册

Jenkins安装手册 一、前期准备工作 因为我是在Windows系统上连接Linux服务器以及需要把在Windows系统下载的安装包上传到Linux系统&#xff0c;所以需要用到两个工具---putty 和FileZilla。 Putty是一个免费的、Windows 32平台下的telnet、rlogin和ssh客户端&#xff0c;但是…

IDEA新UI速览,成了VS Code的样子?

IntelliJ IDEA 2023.1 现已发布。此版本包括对新 UI 的改进&#xff0c;根据从用户那里收到的反馈进行了彻底改造。此外还实现了性能增强&#xff0c;从而在打开项目时更快地导入 Maven 和更早地使用 IDE 功能。由于采用了 background commit checks&#xff0c;新版本提供了简…

【首发】随身wifi编译/使用ffmpeg方法,包含openwrt和debian

目录 1.硬件改造 2.软件改造 3.下一步计划 背景是23年4月入了随身wifi的坑后&#xff0c;发现除了硬件上的改造&#xff0c;软件的可玩性也很大&#xff0c;网上可以找到不少打印机&#xff0c;直播推流&#xff0c;甚至家庭智能硬件的改造教程。笔者是因为改造遥控小车&…