Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑
Django 小实例S1 简易学生选课管理系统 第6节——实现登录逻辑
点击查看教程总目录
作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师。
1 业务逻辑
本教程第四节里面实现了登录页面和一个空的登录逻辑。
第六节这里就把登录逻辑补全。
登录的业务逻辑是:
- 检查是否注册
- 未注册,则提示账号不存在
- 注册但密码不匹配,提示密码不正确
- 注册且信息匹配,成功登录,跳转到个人主页,同时通过cookie保存登录信息。
对于教务管理系统,个人主页应该是其课程主页,所以本部分还需要添加课程主页,这里先只实现一个空的展示其个人信息的课程主页。
2 修改登录视图
修改user/views.py中的login方法如下:
def login(request, kind):
if kind not in ["teacher", "student"]:
return HttpResponse(INVALID_KIND)
if request.method == 'POST':
if kind == "teacher":
form = TeaLoginForm(data=request.POST)
else:
form = StuLoginForm(data=request.POST)
if form.is_valid():
uid = form.cleaned_data["uid"]
if len(uid) != 10:
form.add_error("uid", "账号长度必须为10")
else:
if kind == "teacher":
department_no = uid[:3]
number = uid[3:]
object_set = Teacher.objects.filter(department_no=department_no, number=number)
else:
grade = uid[:4]
number = uid[4:]
object_set = Student.objects.filter(grade=grade, number=number)
if object_set.count() == 0:
form.add_error("uid", "该账号不存在.")
else:
user = object_set[0]
if form.cleaned_data["password"] != user.password:
form.add_error("password", "密码不正确.")
else:
request.session['kind'] = kind
request.session['user'] = uid
request.session['id'] = user.id
return redirect("course", kind=kind)
return render(request, 'user/login_detail.html', {'form': form, 'kind': kind})
else:
context = {'kind': kind}
if request.GET.get('uid'):
uid = request.GET.get('uid')
context['uid'] = uid
if kind == "teacher":
form = TeaLoginForm({"uid": uid, 'password': '12345678'})
else:
form = StuLoginForm({"uid": uid, 'password': '12345678'})
else:
if kind == "teacher":
form = TeaLoginForm()
else:
form = StuLoginForm()
context['form'] = form
if request.GET.get('from_url'):
context['from_url'] = request.GET.get('from_url')
return render(request, 'user/login_detail.html', context)
登录后会在cookie中存储以下信息:
kind: 用户类型,学生或老师user: 用户学号或教师编号
3 添加简单主页
目前虽然是个人主页,但是后面将会是课程主页,老师的和学生的必然是不同的。
所以我们现在也先提前规划好,将主页分为学生的和老师的来处理。
course/views.py代码如下
from django.http.response import HttpResponse
from django.shortcuts import render, reverse, redirect
from user.models import Student, Teacher
from constants import INVALID_KIND
def get_user(request, kind):
"""
:param request:
:param kind: teacher or student
:return: return Teacher instance or Student instance
"""
if request.session.get('kind', '') != kind or kind not in ["student", "teacher"]:
return None
if len(request.session.get('user', '')) != 10:
return None
uid = request.session.get('user')
if kind == "student":
# 找到对应学生
grade = uid[:4]
number = uid[4:]
student_set = Student.objects.filter(grade=grade, number=number)
if student_set.count() == 0:
return None
return student_set[0]
else:
# 找到对应老师
department_no = uid[:3]
number = uid[3:]
teacher_set = Teacher.objects.filter(department_no=department_no, number=number)
if teacher_set.count() == 0:
return None
return teacher_set[0]
# Create your views here.
def home(request, kind):
if kind == "teacher":
return teacher_home(request)
elif kind == "student":
return student_home(request)
return HttpResponse(INVALID_KIND)
def teacher_home(request):
kind = "teacher"
user = get_user(request, kind)
if not user:
return redirect('login', kind=kind)
info = {
"name": user.name,
"kind": kind
}
context = {
"info": info
}
return render(request, 'course/nav.html', context)
def student_home(request):
kind = "student"
user = get_user(request, kind)
if not user:
return redirect('login', kind = kind)
info = {
"name": user.name,
"kind": kind
}
context = {
"info": info
}
return render(request, 'course/nav.html', context)
注意,跳转到一个带参数的url,有两种写法
return redirect(reverse("login", kwargs={"kind": kind}))return redirect('login', kind = kind)
这两种写法返回效果一样
添加模板文件templates/course/nav.html
<!DOCTYPE html>
<html lang="en">
{% load static %}
<head>
<meta charset="UTF-8">
<title>
{% block title %}{% endblock %}
</title>
</head>
<body>
<div class="nav">
<div class="nav-title">
<a href="{% url 'course' kind=info.kind %}">
<p class="main-title">学生选课管理系统</p>
<p class="sub-title">
{% if info.kind == "teacher" %}
教师端
{% elif info.kind == "student" %}
学生端
{% endif %}</p>
</a>
</div>
<div class="name-logo">
<div class="user-name">
{{ info.name }}
</div>
</div>
</div>
<div class="main-content">
{% block content %}{% endblock %}
</div>
</body>
</html>
然后添加course/urls.py如下
from django.urls import path
from course.views import *
urlpatterns = [
path('<slug:kind>/', home, name="course"),
]
同时还要去改下主url,即在SSCMS/urls.py的urlpatterns中添加
path('course/', include("course.urls")),
此时运行软件,登录账号后(这里又注册了一个叫李大爽的用户),
结果如图

4 实现退出登录
退出登录的视图方法如下(在user/views.py中添加)
def logout(request):
if request.session.get("kind", ""):
del request.session["kind"]
if request.session.get("user", ""):
del request.session["user"]
if request.session.get("id", ""):
del request.session["id"]
return redirect(reverse("login"))
添加对应路由(在user/urls.py中的urlpatterns的添加)
path('logout/', views.logout, name="logout")
在修改下登录后的主页视图(即templates/course/nav.html)
在其中的第24行处(即<div class="name-logo">的之前)添加
<div class="log-out">
<a href="{% url "logout" %}">退出</a>
</div>
此时登录后,主页面如下图

点击退出按钮,就可以退出登录,返回登录主页面。
5 简化登录主页url
每次要打开登录主页,都需要在浏览器中输入http://127.0.0.1:8000/user/login
运行django后,控制台只自动给出http://127.0.0.1:8000。
所以这里修改下urlpattern,能够访问http://127.0.0.1:8000即得到登录主页
修改后的SSCMS/urls.py如下
from django.urls import path, include
from user.views import home
urlpatterns = [
path('', home, name="login"),
path('user/', include("user.urls")),
path('course/', include("course.urls")),
]
Django 小实例S1 简易学生选课管理系统 6 实现登录逻辑的更多相关文章
- Django 小实例S1 简易学生选课管理系统 4 实现登录页面
Django 小实例S1 简易学生选课管理系统 第4节--实现登录页面 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新的额外知识点: ...
- Django 小实例S1 简易学生选课管理系统 12 CSS样式完善
Django 小实例S1 简易学生选课管理系统 第12节--CSS样式完善 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块的逻辑代码到这里 ...
- Django 小实例S1 简易学生选课管理系统 11 学生课程业务实现
Django 小实例S1 简易学生选课管理系统 第11节--学生课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,学生需要拥 ...
- Django 小实例S1 简易学生选课管理系统 10 老师课程业务实现
Django 小实例S1 简易学生选课管理系统 第10节--老师课程业务实现 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 课程模块中,老师将要使 ...
- Django 小实例S1 简易学生选课管理系统 9 创建课程模型(model)
Django 小实例S1 简易学生选课管理系统 第9节--创建课程模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 对于课程模块, ...
- Django 小实例S1 简易学生选课管理系统 8 CSS样式优化
Django 小实例S1 简易学生选课管理系统 第8节--CSS样式优化 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 前面的几节下来,用户模块基 ...
- Django 小实例S1 简易学生选课管理系统 7 修改个人信息
Django 小实例S1 简易学生选课管理系统 第7节--修改个人信息 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 用户模块除了注册登录之外,还 ...
- Django 小实例S1 简易学生选课管理系统 2 新建项目(project)并进行设置
Django 小实例S1 简易学生选课管理系统 第2节--新建项目(project)并进行设置 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 0 ...
- Django 小实例S1 简易学生选课管理系统 3 创建用户模型(model)
Django 小实例S1 简易学生选课管理系统 第3节--创建用户模型(model) 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 本文涉及到的新 ...
随机推荐
- 常见错误0xCCCCCCCCC 读取字符串的字符时出错及其引申。
问题描述在一个函数调用中,使用二级指针作为函数参数,传递一个字符串指针数组,但是在访问的时候,却出现了运行时错误,具体表现为"0xCCCCCCCC 读取字符串的字符时出错". 第一 ...
- 使用Jacoco统计服务端代码覆盖情况实践
一.背景 随着需求的迭代,需求增加的同时,有可能会伴随着一些功能的下线.如果不对系统已经不用的代码进行梳理并删除不需要的代码,那么就会增加系统维护成本以及理解成本.但经历比较长的迭代以及系统交接,可能 ...
- Feed 流系统杂谈
什么是 Feed 流 Feed 流是社交和资讯类应用中常见的一种形态, 比如微博知乎的关注页.微信的订阅号和朋友圈等.Feed 流源于 RSS 订阅, 用户将自己感兴趣的网站的 RSS 地址登记到 R ...
- 题解 「JOISC 2016 Day 3」电报
题目传送门 题目大意 给出一个\(n\)个点\(n\)条边的图,每个点有且仅有一个出边,改变每条边都会有对应的花费.求最小的花费使得整个图强连通. 思路 很显然,最后的图就是一个环.那我们要求的答案实 ...
- 题解 「2017 山东一轮集训 Day5」苹果树
题目传送门 题目大意 给出一个 \(n\) 个点的图,每个点都有一个权值 \(f_i\) ,如果 \(f_i=-1\) 表示 \(i\) 这个点是坏的.定义一个点是有用的当且仅当它不是坏的,并且它连的 ...
- 小数的十进制和二进数转换 “无限不循环”小数的IEEE 754表示
十进制 -> 二进制 将整数部分和小数部分分开处理 例:3.125(10) 其整数部分为11(2) 小数部分按照下面的步骤求解: 0.125 x 2 = 0.25 取0 0.250 x 2 = ...
- pycharm中安装和使用sqlite过程详解
创建Django项目,添加app 使用虚拟环境 项目创建默认使用的Django数据库是sqlite 配置静态文件 STATIC_URL = '/static/' # HTML中使用的静态文件夹前缀 S ...
- Golang通脉之流程控制
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的"经脉". Go语言中最常用的流程控制有if和for,而switch和goto主要是为了简化代码. ...
- JavaCPP快速入门(官方demo增强版)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 第31篇-方法调用指令之invokevirtual
invokevirtual字节码指令的模板定义如下: def(Bytecodes::_invokevirtual , ubcp|disp|clvm|____, vtos, vtos, invokevi ...