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

这篇具有很好参考价值的文章主要介绍了(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

每篇前言:

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

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,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 uuid4
    
    account = 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, session
    
    home = 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 home
    
    
    def 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 = True
        SECRET_KEY = 'GuHanZheIsCool'
    
    
    class ProductionConfig(Config):
        pass
    
    
    class DevelopmentConfig(Config):
        pass
    
    
    class TestingConfig(Config):
        pass
    
    

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

from flask.sessions import SecureCookieSessionInterface

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

如果if成立就直接返回,客户端就不会存cookie了!
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

蹦出一个问题:

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

但是如果访问test接口的话,就不正常了:
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

很容易想到,这个问题的原因是因为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}
}

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

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

进第一个父类:

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

所以:

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

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

解决方法:
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

再来看下源码(上面没有看完的部分):
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

不过这部分源码给了我们另一个方法,如果设置SESSION_REFRESH_EACH_REQUEST这个参数为True,每次请求session也都会修改(用这个方法解决):
(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析

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

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

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

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

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

(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】,Flask框架从入门到实战,flask,mvc,原生session实战使用,MTV架构Demo,源码剖析文章来源地址https://www.toymoban.com/news/detail-842024.html

到了这里,关于(二十五)Flask之MTV&MVC架构模式Demo【重点:原生session使用及易错点!】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Django框架入门到精通(03)Django MTV和MVC的区别 (黄菊华老师大学生毕业设计学习教程)

    博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月07日
    浏览(38)
  • MVC设计模式、JSP开发模式、三层架构&MVC练习学生信息管理系统

    本文将介绍MVC设计模式、JSP开发模式、三层架构和MVC练习的基本概念,并演示如何使用这些技术来构建一个学生信息管理系统。该系统将包括数据库准备、查询、增加、删除、更新和分页功能。 MVC是一种软件架构模式,将应用程序分为三个部分:模型(Model)、视图(View)和

    2023年04月25日
    浏览(31)
  • 【软件架构模式——MVC、MVP、MVVM】

    1. MVC(Model-View-Controller) 概念介绍: MVC是一种软件架构模式,用于组织应用程序的代码和逻辑。它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。 **模型(Model)**负责处理应用程序的数据逻辑和状态。它表示应用程序的数据源,并封装了与

    2024年02月11日
    浏览(40)
  • 深入剖析 MVC 模式与三层架构

    前面我们探讨了 JSP 的使用,随着计算机技术的不断更新迭代,JSP 的技术由于存在很多的缺点,已经逐渐退出了历史的舞台,所以在学习时,我们只需要了解其如何实现的数据的增删改查。不用刨根问底,花费大量的时间,得不偿失。 理解 JSP 及其原理 学会使用 EL 表达式和

    2024年02月22日
    浏览(29)
  • MVC设计模式和与三层架构的关系

    M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为数据承载Bean:专门存储业务数据的,如 Student、User 等 一类称为业务处理Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。 V:View,视图层,指工程中的html或jsp等页面,作用是与用

    2024年01月22日
    浏览(39)
  • 【Android】MVC,MVP,MVVM三种架构模式的区别

    MVC 传统的代码架构模式,仅仅是对代码进行了分层,其中的C代表Controller,控制的意思 将代码划分为数据层,视图层,控制层,三层之间可以任意交互 MVP MVP是在MVC基础上改进而来的一种架构,其中的P代表Presenter,主持的意思 它主要在以下两方面进行了改进:解耦,接口化

    2024年02月13日
    浏览(41)
  • Android安卓架构MVC、MVP、MVVM模式的概念与区别

    目录 MVC框架 MVP框架 MVVM框架 MVVM与MVP区别 MVVM与MVC区别 MVC、MVP、MVVM模式哪个要好一些 MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)是三种常见的软件架构模式,它们的目的都是将应用程序的不同部分分离开来,以提高代码的可维护性、可扩展性和可

    2024年02月21日
    浏览(36)
  • Servlet-搭建个人博客系统(MVC架构模式简介,maven的配置和使用)

    目录 1. MVC架构模式简介 2. maven的配置和使用 3. 项目总述🐻 3.1 🍎Controller层 3.2 🍎Model层 3.3 🍎View层 4. 页面的主要功能实现🐻 4.1 🍎登陆页面(login.html) 4.2 🍎博客列表页面(blog_index.html) 4.3 🍎博客详情页面(blog_detail.html) 4.4 🍎博客编辑页(blog_editor.html) 5.Conto

    2024年02月05日
    浏览(28)
  • [Java]JavaWeb学习笔记(动力节点老杜2022)【Javaweb+MVC架构模式完结】

    视频地址:动力节点最新JavaWeb视频教程,javaweb零基础入门到精通IDEA版https://www.bilibili.com/video/BV1Z3411C7NZ?p=1vd_source=93ab990b9131a1b90943874a5448830a 资料链接:https://pan.baidu.com/s/1y-Dm0dGjQQOvARFBmGiG1w?pwd=1234 提取码:1234 【Tomcat服务器版本与支持Java版本的对应关系:https://tomcat.apache.org/whi

    2023年04月09日
    浏览(195)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包