(二十五)Flask之MTVMVC架构模式Demo【重点:原生session使用及易错点!】

目录:

  • 每篇前言:
  • MTV&MVC
  • 构建一个基于MTV模式的Demo项目:
    • 蹦出一个问题:

每篇前言:

  • 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者

  • 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入门到实战》
  • 🔥🔥热门专栏推荐:《Python全栈系列教程》、《爬虫从入门到精通系列教程》、《爬虫进阶+实战系列教程》、《Scrapy框架从入门到实战》、《Flask框架从入门到实战》、《Django框架从入门到实战》、《Tornado框架从入门到实战》、《前端系列教程》。
  • 📝​📝本专栏面向广大程序猿,为的是大家都做到Python全栈技术从入门到精通,穿插有很多实战优化点。
  • 🎉🎉订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
  • 🚀🚀加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!

在这里插入图片描述

MTV&MVC

先来讲一下两种常见的软件架构模式——MTV和MVC~

它俩是用于组织和管理应用程序的不同组件和逻辑。通常用于开发Web应用程序和其他软件项目。

  1. MTV(Model-Template-View):
    • Model(模型):表示应用程序的数据和业务逻辑。它负责管理数据的存储、检索和处理,以及处理与数据相关的操作。
    • Template(模板):定义了应用程序用户界面的外观和结构,通常使用模板语言编写,将动态数据插入静态页面中。
    • View(视图):表示用户界面的逻辑部分,它从模型中获取数据并将其呈现到模板中,然后将结果发送给用户的浏览器。视图还可以处理用户的输入和用户界面的交互。

MTV模式是Django Web框架的一部分(但是这个模式也非常适合Flask),其中Model对应于数据模型,Template对应于模板文件,View对应于视图函数,这些组合在一起用于构建Web应用程序。

  1. MVC(Model-View-Controller):
    • Model(模型):与MTV中的模型类似,负责应用程序的数据和业务逻辑。它处理数据的存储、检索和处理。
    • View(视图):与MTV中的视图有些不同,它表示应用程序的用户界面,但不直接与模板相关。视图接收用户输入,处理它并与模型进行通信以更新数据。
    • Controller(控制器):控制器是MVC的核心,它负责接收用户输入并根据输入调度视图和模型的操作。它决定如何响应用户的请求,并确保模型和视图之间的协同工作。

MVC模式通常在框架如Spring、Ruby on Rails等中使用,它的核心思想是分离数据处理、用户界面和控制流,以提高代码的可维护性和可扩展性。控制器充当用户输入的处理中心,调度模型和视图以完成所需的操作。

总的来说,MTV和MVC都是用于组织和管理应用程序代码的模式,它们有不同的实现方式,但目标都是分离关注点,以提高代码的可读性和可维护性。

一一对应:

在这里插入图片描述

Flask如果采用MVC架构的话,项目结构demo:

在这里插入图片描述

但是推荐在Flask中使用MTV架构模式,而且Flask中主流也是用这个:

在这里插入图片描述

构建一个基于MTV模式的Demo项目:

在这里插入图片描述

  • login.html:

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><title>用户登录</title>
    </head>
    <body>
    <form action="" method="post"><input type="text" name="user"><input type="text" name="pwd"><input type="submit" value="提交">{{msg}}
    </form>
    </body>
    </html>
    
  • account.py:

    from flask import Blueprint, render_template, request, session, redirect
    from uuid import uuid4account = Blueprint('account', __name__)@account.route('/login', methods=['GET', 'POST'])
    def login():if request.method == 'GET':return render_template('login.html')user = request.form.get('user')pwd = request.form.get('pwd')if user == 'GuHanZhe' and pwd == '123':uid = str(uuid4())session['user_info'] = {'id': uid, 'name': user}return redirect('/index')else:return render_template('login.html', msg='用户名获或密码错误')
  • home.py:

    from flask import Blueprint, sessionhome = Blueprint('home', __name__)@home.route('/index')
    def index():user_info = session.get('user_info')print(user_info)return 'Index'@home.route('/test')
    def test():return 'Test'
  • __init__.py:

    from flask import Flask
    from .views import account
    from .views import homedef create_app():app = Flask(__name__)app.config.from_object('settings.DevelopmentConfig')app.register_blueprint(account.account)app.register_blueprint(home.home)return app
  • manage.py:

    from flask_stru import create_app
    app = create_app()if __name__ == '__main__':app.run()
  • settings.py:

    class Config(object):DEBUG = TrueSECRET_KEY = 'GuHanZheIsCool'class ProductionConfig(Config):passclass DevelopmentConfig(Config):passclass TestingConfig(Config):pass

运行manage.py文件,访问login登录(登录成功的话):

在这里插入图片描述

来看下源码,看看默认cookie过期时间是多久:

from flask.sessions import SecureCookieSessionInterface

在这里插入图片描述
在这里插入图片描述

可以看到注释中表示这个值默认是31天~而且我们可以设置这个值:

在这里插入图片描述

而这个参数生效的前提是session.permanent为True(默认就是为True);

如果设置为False,则关闭浏览器cookie就失效。

在这里插入图片描述

再看看源码设置cookie的(save_session)上面这一部分:

如果if成立就直接返回,客户端就不会存cookie了!
在这里插入图片描述

蹦出一个问题:

在这里插入图片描述

访问index接口是正常的,name修改成功:

在这里插入图片描述

但是如果访问test接口的话,就不正常了:
在这里插入图片描述

很容易想到,这个问题的原因是因为cookie修改后没有保存!

抛出答案,这是因为修改cookie的话,默认只有当第一层修改才会保存,而第二层、第三层等…都不会保存。

{user_info: {k1: 1, k2: 2}
}如果是第一层被修改会保存:
{user_info: {k1: 1, k2: 2},xxx :{'A': 5}
}
但是如果是第二层,第三层...修改不会保存:
{user_info: {k1: 1, k2: 2, k3: 3}
}

看源码分析这种问题的点源于何处:

在这里插入图片描述
在这里插入图片描述

斗胆翻译一下第一个箭头所指变量对应的注释部分:

“当数据发生变化时,将此标志设置为True。仅跟踪会话字典本身;如果会话包含可变数据(例如嵌套的字典),则在修改该数据时必须手动将此标志设置为True。仅当此标志为True时,会话cookie才会写入响应中。”

进第一个父类:

在这里插入图片描述
在这里插入图片描述

调用on_update函数了就会给modified设为True。

所以:

session['user_info'] = 'abc'     # session.__setitem__
session['user_info'][('name')]

第一行会修改,但是第二行是调用的__getitem__,而源码(上图)没有相关处理,所以不会保存。

解决方法:
在这里插入图片描述

再来看下源码(上面没有看完的部分):
在这里插入图片描述
在这里插入图片描述

进去看,因为设置了modified为True,所以这个should_set_cookie就为True,所以这个if就不成立,就继续往下执行。

不过这部分源码给了我们另一个方法,如果设置SESSION_REFRESH_EACH_REQUEST这个参数为True,每次请求session也都会修改(用这个方法解决):
在这里插入图片描述

而且推荐使用这个方法,推荐用这个的原因:

想象一个使用场景,如果用户登录一个网站,cookie设置的二十分钟失效,如果这个过程中用户一直没有做cookie相关的操作,那么20分钟后登录就失效了,但是如果这二十分钟用户一直在访问这个网站,是不应该让用户失效的。

如果设置了上述这个参数为True,就不会出现这种问题,

SESSION_REFRESH_EACH_REQUEST 的行为是在用户请求时将会话标记为“新的”(fresh),以确保它在每个请求之后都会被刷新。这意味着,无论用户是否刷新浏览器或进行其他操作,都会重置会话的过期时间。这是为了确保用户在与应用交互期间会话不会过期(过期时间会从用户刷新的时间重新往后计算)

Flask中使用的话,要在登录成功后设置一下permanent也为True(但是如果用flask-session就不用了,因为这个默认是为True):

在这里插入图片描述

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

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

相关文章

关于Transfomer的思考

为何诞生 在说transformer是什么&#xff0c;有什么优势之类的之前&#xff0c;先谈一谈它因何而诞生。transformer诞生最重要的原因是早先的语言模型&#xff0c;比如RNN&#xff0c;由于其本身的训练机制导致其并行度不高&#xff0c;特别是遇到一些长句子的情况下。其次&…

抖音开放平台第三方开发,实现代小程序备案申请

大家好&#xff0c;我是小悟 抖音小程序备案整体流程总共分为五个环节&#xff1a;备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。 服务商可以代小程序发起备案申请。在申请小程序备案之前&#xff0c;需要确保小程序基本信息已填写完成、小程序至少存在一个…

硬件笔记(26)---- 高速电路中滤波电容的选取

先要知道电容的等效电路 其中ESL取决于电容的类型和封装&#xff0c;一般用贴片陶瓷电容为例&#xff0c;对于直插式电解电容&#xff0c;他们的ESL很大。按下表&#xff0c;封装越大&#xff0c;ESL越大&#xff0c;但是0612有些例外 0612和1206就是 长短边的区别&#xff0c;…

什么是MVC三层结构

1.MVC&#xff08;三层结构&#xff09; MVC&#xff08;Model-View-Controller&#xff09;是一种常见的软件设计模式&#xff0c;用于将应用程序的逻辑和界面分离成三个不同的组件。每个组件负责特定的任务&#xff0c;从而提高代码的可维护性和可扩展性。 以前的模式。 遇到…

【网络安全渗透】常见文件上传漏洞处理与防范

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;网络安全渗透 景天的主页&#xff1a;景天科技苑 文章目录 1.文件上传漏洞1.1. 描述1.2. 危害1.3. 有关文件上传的知识1.4…

【兔子机器人】修改GO、车轮电机ID(软件方法、硬件方法)以及修正VMC腿部初始化夹角

一、GO电机修改ID 1、硬件方法 利用上位机直接修改GO电机的id号&#xff1a; 打开调试助手&#xff0c;点击“调试”&#xff0c;查询电机&#xff0c;修改id号&#xff0c;即可。 但先将四个GO电机连接线拔掉&#xff0c;不然会将连接的电机一并修改。 利用24V电源给GO电机…

Java_12 杨辉三角 II

杨辉三角 II 给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1] 示例 2: 输入: rowIndex 0 输出: [1] 示例 3: 输入: rowIndex 1 输…

【应急响应靶场web2】

文章目录 前言 一、应急响应 1、背景 2、webshell查杀 3、日志排查 1&#xff09;apache日志 2&#xff09;nginx日志 3&#xff09;ftp日志 4、隐藏账户 5、文件筛选 二、漏洞复现 总结 前言 靶场来源&#xff1a;知攻善防实验室 一、应急响应 1、背景 小李在某…

VMware 配置虚拟机网络

之前需要完成的任务 &#xff08;1&#xff09;、下载和安装VMware-Workstation-Pro.exe软件&#xff0c;推荐16.0版本 &#xff08;2&#xff09;、下载centOS7镜像&#xff0c;可以在阿里云下载。 &#xff08;3&#xff09;、VM创建一个虚拟机&#xff0c;并且使用本地已下载…

中东社媒Snapchat如何注册?

Snapchat是一款图片分享软件应用。利用该应用程序&#xff0c;用户可以拍照、录制影片、撰写文字和图画,并传送到自己在该应用上的好友列表。现如今&#xff0c;Snapchat也成为独立战引流然而&#xff0c;即使如此受欢迎&#xff0c;Snapchat的注册使用仍然是新手的难题&#x…

Java基于 Springboot+Vue 的招生管理系统,前后端分离

博主介绍&#xff1a;✌程序员徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【全志H616】1 --用orangepi控制硬件

【全志H616】1 --用orangepi控制硬件 本文介绍了如歌用orangepi 控制蜂鸣器&超声波模块&#xff0c;通过键盘输入1、2、3、4来控制转动角度舵机模块&#xff1b;同时还介绍了利用全志如何配置定时器&#xff1b;以及查看H616引脚状态的命令等… 超声波模块和舵机模块的讲解…

德人合科技 | 公司办公终端、电脑文件资料 \ 数据透明加密防泄密管理软件系统

天锐绿盾是一款全面的企业级数据安全解决方案&#xff0c;它专注于为企业办公终端、电脑文件资料提供数据透明加密防泄密管理。 首页 德人合科技——www.drhchina.com 这款软件系统的主要功能特点包括&#xff1a; 1. **透明加密技术**&#xff1a; 天锐绿盾采用了透明加密技…

Android Gradle 编译过程中的优化

} 但是反射没有办法能很好的识别&#xff0c;所以如果代码中有使用反射需要自行处理&#xff0c;以免被删除。 shrink resource 功能 shrink code流程执行完后删除了无用的代码后&#xff0c;就能确认哪些资源文件没有使用&#xff0c;shrink resource流程就是确定哪些资源…

DB107-ASEMI智能LED灯具专用DB107

编辑&#xff1a;ll DB107-ASEMI智能LED灯具专用DB107 型号&#xff1a;DB107 品牌&#xff1a;ASEMI 封装&#xff1a;DB-4 正向电流&#xff08;Id&#xff09;&#xff1a;1A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1000V 正向浪涌电流&#xff1a;50A 正…

【大厂秋招高频算法】阿里秋招高频算法题汇总

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

Windows,MacOS,Linux下载python并配置环境图文讲解

Windows 打开python官网 点击download 点击黄色按钮 另存为 打开文件 全选 配置安装路径 安装中 关闭路径长度限制 完成 验证 同时按住winr(win就是空格键左边的东西) 输入cmd 键入python,如果出现版本(红框)即安装成功 MacOS 同理打开python官网 点击最新版本 拖…

看!Chat4.0如何看待AI与光纤资源管理软件的应用结合点及价值

问&#xff1a;你好&#xff0c;AI在光纤资源管理软件中有那些应用结合点&#xff0c;请详细描述应用结合点及价值? 答&#xff1a;AI在光纤资源管理软件中的应用结合点涉及多个方面&#xff0c;它们通过智能化的手段提高资源管理的效率和准确性。以下是一些关键的应用结合点及…

Midjourney视觉垫图

https://github.com/lllyasviel/Fooocus/discussions/117https://github.com/lllyasviel/Fooocus/discussions/117掌握Midjourney的垫图技巧&#xff1a;AI绘画中的参考利器本期将深入了解AI绘画的垫图技巧&#xff0c;让作品获得更好的出图效果https://mp.weixin.qq.com/s/RS2…

unity3d Animal Controller的Animal组件中Stances,Advanced基础部分理解

Stances 立场 立场要求在动物动画控制器上的姿态动画参数。 你可以有多个运动状态,并根据当前的立场使用它们 过渡的条件是: Stance StanceID Default Stance默认姿势 如果调用函数Stance_Reset&#xff08;&#xff09;&#xff0c;动物将返回到的默认姿势。 Current …