Django前后端分离之后端基础3

12 案例:登录_哔哩哔哩_bilibili   参考大佬的B站视频教程笔记


目录

登录接口的实现会话机制成功后的信息保存:

中间件的使用,解决登录保护使未登录过的用户进行登录

Form组件 - 主要作用:

Form组件信息的配置

ModelForm组件 - 特点:

验证码的保存在session会话中并设置过期时间

缓存的使用

python 快速定位问题小技巧:(traceback的使用)


登录接口的实现会话机制成功后的信息保存:
  1. 生成随机字符串
  2. 返回到用户的浏览器的cookie中
  3. 存储到网站的session中  随机字符串+用户标识
中间件的使用,解决登录保护使未登录过的用户进行登录
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse, redirectclass AuthMiddleware(MiddlewareMixin):# 项目运行前的操作请求,钩子函数def process_request(self, request):# 0.排除那些不需要登录就能访问的页面#   request.path_info 获取当前用户请求的URL /login/if request.path_info in ["/login/", "/image/code/"]:return# 1.读取当前访问的用户的session信息,如果能读到,说明已登陆过,就可以继续向后走。info_dict = request.session.get("info")# print(info_dict)if info_dict:return# 2.没有登录过,重新回到登录页面return redirect('/login/')
# 注册app中间件
'myapp.middleware.auth.AuthMiddleware'
Form组件 - 主要作用:

1.生成html表单标签、数据校验

2.form = LoginForm(initial={'user':'xxx','password':'xxx'}) # Web页面默认值,字典类型

Form组件信息的配置
# form 组件配置
class LoginForm(BootStrapForm):username = forms.CharField(label="用户名",widget=forms.TextInput,required=True)password = forms.CharField(label="密码",widget=forms.PasswordInput(render_value=True), # 展示数据(加密点显示)required=True)code = forms.CharField(label="验证码",widget=forms.TextInput,required=True)def clean_password(self):  # 密码采用md5加密pwd = self.cleaned_data.get("password")return md5(pwd)

数据校验视图

def login(request):""" 登录 """if request.method == "GET":form = LoginForm()return render(request, 'login.html', {'form': form})form = LoginForm(data=request.POST)# form = LoginForm(initial={'user':'xxx','password':'xxx','code':'xxxx'})  # Web页面初始值if form.is_valid():# 验证成功,获取到的用户名和密码# {'username': 'wupeiqi', 'password': '123',"code":123}# 验证码的校验user_input_code = form.cleaned_data.pop('code')code = request.session.get('image_code', "")if code.upper() != user_input_code.upper():form.add_error("code", "验证码错误")return render(request, 'login.html', {'form': form})# 去数据库校验用户名和密码是否正确,获取用户对象、None# admin_object = models.Admin.objects.filter(username=xxx, password=xxx).first()admin_object = models.Admin.objects.filter(**form.cleaned_data).first()if not admin_object:form.add_error("password", "用户名或密码错误")# form.add_error("username", "用户名或密码错误")return render(request, 'login.html', {'form': form})# 用户名和密码正确# 网站生成随机字符串; 写到用户浏览器的cookie中;在写入到session中;request.session["info"] = {'id': admin_object.id, 'name': admin_object.username}# session可以保存7天request.session.set_expiry(60 * 60 * 24 * 7)return redirect("/admin/list/")return render(request, 'login.html', {'form': form})

登录页面login.html

<div class="account"><h2>用户登录</h2><form method="post" novalidate>{% csrf_token %}<div class="form-group"><label>用户名</label>{{ form.username }}<span style="color: red;">{{ form.username.errors.0 }}</span></div><div class="form-group"><label>密码</label>{{ form.password }}<span style="color: red;">{{ form.password.errors.0 }}</span></div><div class="form-group"><label>图片验证码</label><div class="row"><div class="col-xs-7">{{ form.code }}<span style="color: red;">{{ form.code.errors.0 }}</span></div><div class="col-xs-5"><img id="image_code" src="/image/code/" style="width: 125px;"></div></div></div><input type="submit" value="登 录" class="btn btn-primary"></form>
</div>
ModelForm组件 - 特点:
  1. 校验数据,生成表单标签
  2. 使用obj直接保存数据到数据库,免去复杂的xxx.objects.create(xxx)
  3. 默认显示数据,对象类型

        obj=xxx.objects.filter(id=1).first()   

        obj=xxxModelForm(instance=obj)

  1. 依赖于数据库的model,减少字段的定义
    class Meta:model = xxxfields = ['username']# fields = "__all__"

 ModelForm组件

class UserModelForm(BootStrapModelForm):name = forms.CharField(min_length=3,label="用户名",widget=forms.TextInput(attrs={"class": "form-control"}))class Meta:model = models.UserInfofields = ["name", "password", "age", 'account', 'create_time', "gender", "depart"]# fields = '__all__'

数据检验与保存

def user_model_form_add(request):""" 添加用户(ModelForm版本)"""if request.method == "GET":form = UserModelForm()return render(request, 'user_model_form_add.html', {"form": form})# 用户POST提交数据,数据校验。form = UserModelForm(data=request.POST)if form.is_valid():# 如果数据合法,保存到数据库# {'name': '123','account': Decimal('0'),'gender': 1, 'depart': <Department: IT运维部门>}# print(form.cleaned_data)form.save()  # 同  models.UserInfo.objects.create(..)return redirect('/user/list/')# 校验失败(在页面上显示错误信息)return render(request, 'user_model_form_add.html', {"form": form})

 用户web页面user_add.html

<div class="container"><div class="panel panel-default"><div class="panel-heading"><h3 class="panel-title"> 新建用户 </h3></div><div class="panel-body"><form method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label>{{ field.label }}</label>{{ field }}<span style="color: red;">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提 交</button></form></div></div>
</div>
验证码的保存在session会话中并设置过期时间
# 写入到自己的session中(以便于后续获取验证码再进行校验)
request.session['image_code'] = code_string
# 给Session设置60s超时
request.session.set_expiry(60)
# 校验
# 验证码的校验
user_input_code = form.cleaned_data.pop('code')
code = request.session.get('image_code', "")
if code.upper() != user_input_code.upper():form.add_error("code", "验证码错误")return render(request, 'login.html', {'form': form})

保存用户登录的信息到session并设置过期时间

# 网站生成随机字符串; 写到用户浏览器的cookie中;在写入到session中;
request.session["info"] = {'id': admin_object.id, 'name': admin_object.username}
# session可以保存7天
request.session.set_expiry(60 * 60 * 24 * 7)

用户密码的加密形式(即用户输入的密码是密钥加密和MD5加密后来进行和数据库中比对)

def md5(data_string): # SECRET_KEY + MD5 加密obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))obj.update(data_string.encode('utf-8'))return obj.hexdigest()

用户注销功能的实现

def logout(request):""" 注销 """request.session.clear() # 清除session会话信息return redirect('/login/')

model中的choices字段的获取

# 在django中做的约束
gender_choices = ((1, "男"),(2, "女"),)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)

 获取方法:get_字段名_display() 

queryset = models.UserInfo.objects.all()
for row in queryset:print(row.get_gender_display()) # 输出男或女# [注意:row.get_gender_display在前端页面时不要加括号,django自动实现]
缓存的使用
  • 响应头 Expires  缓存过期时间,用来指定资源到期的时间
  • 响应头 Chche Control,用于控制网页的缓存,创建后的时间缓存失效,单位s
  • get_or_set 若未获取到数据则执行set操作
  • add(key,value) 存储缓存
  • get(key) 获取缓存数据
  • set_many(dict,timeout) 批量存储缓存
  • delete(key) 删除缓存数据
  • get_many(key_list) 批量获取数据
# setting config
CACHES = {'default':{'BACKEND':'django.core.cache.backends.locmem.LocMemCache', # 内存缓存'LOCATION':'unique-snowflake','TIMEOUT':300,'OPTIONS':{'MAX_ENTRIES':300, # 缓存最大数据条数'CULL_FREQUENCY':2, # 当缓存条数达到最大值时,删除1/x的缓存数据}}
}
# view
import time
from django.views.decorators.cache import cache_page
@cache_page(15) # 缓存时间,多长时间缓存一次,单位s
def test_cache(request):t = time.time()return HttpResponse('time is %s'%(t))

 

python 快速定位问题小技巧:(traceback的使用)
import traceback
try:a
except:print(traceback.format_exc())
"""
输出
Traceback (most recent call last):File "E:/desktop/my_dj/web/app/tests.py", line 6, in <module>a
NameError: name 'a' is not defined
"""

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

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

相关文章

【MySQL】MySQL数据管理——DDL数据操作语言(数据表)

目录 创建数据表语法列类型字段属性SQL示例创建学生表 查看表和查看表的定义表类型设置表的类型 面试题&#xff1a;MyISAM和InnoDB的区别设置表的字符集删除表语法示例 修改表修改表名语法示例 添加字段语法示例 修改字段语法示例 删除字段语法示例 数据完整性实体完整性域完整…

使用Fragments(片段)提升你的Vue.js开发体验

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HCIA-Datacom实验指导手册:6 构建基础 WLAN 网络

HCIA-Datacom实验指导手册&#xff1a;6 构建基础 WLAN 网络 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;1.掌握ap上线的配置方式和上线过程。ac配置验证 步骤 2 掌握隧道模式和旁挂模式下ac的配置。步骤 3 掌握查看ap…

【Vue3】回顾watch,学习watchEffect

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

mount命令最新详细教程

背景 需要在设备上面&#xff0c;自动化运行u盘里面的脚本&#xff0c;并且进入一个产测模式。因此实际使用了这个mount命令&#xff0c;所以&#xff0c;写了这么一篇供大家参考。 一. 定义 mount命令在Linux和类Unix系统中用于挂载文件系统&#xff0c;即将存储设备…

数仓模型设计方法论

在当今大数据时代&#xff0c;数据已经成为企业最重要的资产之一。而数据仓库作为企业数据管理和分析的核心基础设施&#xff0c;其设计方法论对于企业的数据治理和决策分析至关重要。本文将探索数仓模型设计的方法论&#xff0c;帮助读者更好地理解和应用数仓模型设计。 一、…

从零开始手写RPC框架(1)

学习java后端也有一段时间了&#xff0c;在网上寻一些教程和github上的开源库&#xff0c;学习从零开始手写一个RPC&#xff0c;学习各位大牛的代码适当修改&#xff0c;并贴上自己的一些见解和注释。 目录 RPC简介RPC和HttpClient的区别和共同点常见RPC框架 RPC框架设计常见序…

ISP代理是什么?怎么用?

在跨境出海业务中&#xff0c;代理IP对于您的在线任务至关重要&#xff0c;尤其是对于那些运行多个帐户的人来说。为您的帐户选择正确类型的代理对于确保帐户安全非常重要&#xff0c;劣质的IP容易使账号遭受封号风险。IPFoxy的多种代理IP类型应用范围各有侧重&#xff0c;其中…

html5移动端开发面试,2024年Android开发者常见面试题

Java相关 无论什么级别的Android从业者&#xff0c;Java作为Android开发基础语言。不管是工作还是面试中&#xff0c;Java都是必考题。如果不懂Java的话&#xff0c;薪酬会非常吃亏&#xff08;美团尤为重视Java基础&#xff09; 详细介绍了Java泛型、注解、并发编程、数据传…

“智农”-数字乡村可视化

“智农”打造数字乡村可视化&#xff0c;结合乡村区域实际情况&#xff0c;以规划完善乡村机制体系和更好服务乡村振兴为目标&#xff0c;坚持可持续、可复制、可扩展的建设原则&#xff0c;着力解决农村信息孤岛&#xff0c;提高农村种植技术&#xff0c;加快农村信息化和产业…

Tomcat安装,配置文件、组件

一、Tomcat的基本功能 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

《Redis 设计与实现》读书概要

注&#xff1a; 《Redis 设计与实现》一书基于 Redis 2.9 版本编写&#xff0c;部分内容已过时&#xff0c;过时之处本文会有所说明。本文为读书笔记&#xff0c;部分简单和日常使用较少的知识点未记录。原书网页版地址 https://redisbook.com/ 一、底层数据结构 SDS(Simple Dy…

动态规划总结

参考来源&#xff1a;代码随想录 文章目录 基础概念具体应用的问题基础问题背包问题0-1背包完全背包 打家劫舍问题股票买卖问题子序列问题 基础概念 状态推导&#xff1a;动态规划中每一个状态一定是由上一个状态推导出来的。 动规五部曲&#xff1a; 确定dp[i]或者dp[i][j]…

吴恩达机器学习全课程笔记第四篇

目录 前言 P61-P68 激活函数 Softmax算法 P69-P73 Adam算法 更多类型的层 模型评估 P74-P79 偏差和方差 建立表现基准 学习曲线 偏差和方差与神经网络 前言 这是吴恩达机器学习笔记的第四篇&#xff0c;第三篇笔记请见&#xff1a; 吴恩达机器学习全课程笔记第…

react使用@reduxjs/toolkit和react-redux实现store状态管理

一、概述 reduxjs/toolkit和react-redux是用于在React应用中管理全局状态的工具库 1、reduxjs/toolkit&#xff1a; reduxjs/toolkit是Redux官方推荐的工具库&#xff0c;是对 Redux 的二次封装&#xff0c;它提供了一些便捷的API和工具&#xff0c;帮助开发者更快速地编写R…

上海雷卯推出USB4接口的静电浪涌保护方案

一、 USB4技术性能特点 USB4是USB3.2 的后继版本,是最新的USB规范。USB4是通信协议&#xff0c;采用的硬件接口是USB Type-C 接口&#xff0c;USB Type-C 端口根据 USB3.x 和 USB4 协议传输数据。它的接口标准是由 USB Promoter Group 制定的&#xff0c;主要规范了USB4 接口的…

基于x86架构的OpenHarmony应用生态挑战赛等你来战!

为了更快速推进OpenHarmony在PC领域的进一步落地&#xff0c;加快x86架构下基于OpenHarmony的应用生态的繁荣&#xff0c;为北向应用开发者提供一个更加便捷的开发环境&#xff0c;推动OpenHarmony北向应用开发者的增加&#xff0c;助力OpenHarmony在PC领域实现新的突破&#x…

【c语言】探索结构体---解锁更多选择

前言 结构体属于自定义类型的一种&#xff0c;这增加了我们写代码的选择&#xff0c;跟着我的脚步一起来探索结构体吧~ 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 认识结构体 结构是⼀些值的集合&#xff0c;这些值…

iMazing3安全吗?好不好用?值不值得下载

一、安全性 iMazing在设计和开发过程中&#xff0c;始终把用户数据的安全性放在首位。它采用了多种先进的安全技术来确保用户数据在传输、备份和存储过程中的安全。 iMazing3Mac-最新绿色安装包下载如下&#xff1a; https://wm.makeding.com/iclk/?zoneid49816 iMazing3Wi…

深度学习 精选笔记(6)模型选择与正则化

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增)&#xff0c;以达到集多方教程的精华于一文的目的。 ③非常推荐上面&#xff08;学习参考&#x…