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的区别设置表的字符集删除表语法示例 修改表修改表名语法示例 添加字段语法示例 修改字段语法示例 删除字段语法示例 数据完整性实体完整性域完整…

Pikachu 漏洞练习平台pika~pika~

一、Burte Force&#xff08;暴力破解&#xff09; “暴力破解”是一攻击具手段&#xff0c;在web攻击中&#xff0c;一般会使用这种手段对应用系统的认证信息进行获取。 其过程就是使用大量的认证信息在认证接口进行尝试登录&#xff0c;直到得到正确的结果。 为了提高效率&am…

使用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…

女生是漂亮重要还是学历重要?

在经济上升期&#xff0c;漂亮更重要。 比如2012-2018年这六年&#xff0c;因为互联网和房地产的繁荣造就了一大堆有钱人。 因为这些大哥钱来得快&#xff0c;愿意给女人花钱。稍微有点颜值的女人&#xff0c;只要愿意&#xff0c;那几年在大哥身上捞个上百万问题不大吧&…

【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;其中…

2024最新的软件测试面试八股文

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题&#…

pc端如何做自适应呢?

<!-- 默认html的font-size的大小是16px 1rem 16px --> <!-- 想要实现自适应的前提条件是 当浏览器的窗口发生变化的时候&#xff0c; html的font-size将会跟着发生改变 --> <!-- 实现的步骤如下 --> <!-- 1 借助flexble.js文件 --> <!-- 2 将fle…

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…

GitOps实践之Argo CD

文章目录 GitOps什么是GitOpsGitOps是用于构建云原生应用程序的操作模型使用GitOps的前置条件声明式描述整个应用系统,并使用Git进行版本化控制Git Approved Changes后自动更新通过GitOps确保正确性以及分歧报警不可变基础设施、IaC与GitOpsGitOps的工作模式Git对环境配置进行…

【数仓】基本概念、知识普及、核心技术

一、数仓基本概念 数仓的定义&#xff1a; 数据仓库&#xff08;Data Warehouse&#xff0c;简称DW或DWH&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。简言之&#xff0c;它是一个大型存储库&#xff0c;用于存储来…

《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; 吴恩达机器学习全课程笔记第…