(二十三)Flask之高频面试点

目录:

  • 每篇前言:
    • Q1:为什么把request和session放在一起?
    • Q2:Local对象的作用?
    • Q3::LocalStack对象的作用?
    • Q4:一个运行中的Flask应用程序分别包括几个Local/LocalStack?
    • Q5:什么是g?
    • Q6:视图函数中使用的session/g/current_app/request在Flask源码中流程是什么样的?
    • Q7:一些Python中重要技术栈相关可能会问到的面试点

每篇前言:

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

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

在这里插入图片描述

Q1:为什么把request和session放在一起?

ctx = RequestContext(request, session)

在 Flask 中,requestsession 是两个不同的概念和对象,它们被放在一起的主要原因是**为了方便开发者编写 Web 应用程序,提供了方便的访问和交互方式。**虽然它们都与 HTTP 请求和会话状态相关,但它们有不同的用途和生命周期。

  1. request 对象:

    • request 对象代表了当前 HTTP 请求的内容,包括请求方法、请求头、请求数据、查询参数、表单数据等。它提供了访问和操作当前请求的数据的方法,使开发者能够轻松地处理来自客户端的请求。
    • request 对象通常用于接收来自客户端的数据,例如用户提交的表单数据、查询参数、请求头信息等。开发者可以从 request 对象中提取这些数据以执行相应的操作。
  2. session 对象:

    • session 对象用于在不同的 HTTP 请求之间存储用户会话数据。它允许开发者将某些数据持久化存储,以便用户在不同的请求之间保持状态。通常,session 数据存储在服务器端,而客户端通过 cookie 或其他机制来标识与会话关联的数据。
    • session 对象通常用于存储用户的登录状态、购物车内容、个性化设置等需要在用户不同请求之间共享的数据。

requestsession 放在一起的主要原因是,**它们通常在处理 Web 请求时一起使用,以实现访问和操作用户请求数据以及维护用户会话状态。这种集成使得在处理用户请求时更加方便,因为您可以方便地访问请求数据并将需要的信息存储在会话中,以实现跨不同请求的状态维护。**虽然它们具有不同的用途,但它们经常一起使用以构建功能丰富的 Web 应用程序。

Q2:Local对象的作用?

在 Flask 中,Local 对象是一种线程/协程本地存储机制,它是 Flask 自己的实现,并基于 threading.local 和协程库(如 Greenlet)来实现。它的主要作用是在多线程或协程环境中安全地存储和访问数据,以确保每个线程或协程都拥有自己的独立副本,避免了数据共享和竞争条件的问题。

再分点说一些具体的细节部分(这样会加分哦~):

  1. 多线程支持:在多线程环境中,每个线程都有自己的 Local 存储空间,其中的数据不会被其他线程访问或修改,确保数据隔离。这有助于处理来自不同客户端的并发请求。

  2. 协程支持:Flask 的 Local 对象还支持协程。在协程模型中,每个协程也可以有自己的存储空间,以保证数据的隔离。这对于使用协程库(如 Greenlet 或 Gevent)来构建高性能应用程序非常有用。

  3. 上下文隔离Local 对象允许在不同上下文(例如请求处理过程)中存储和访问相关数据,而不会干扰其他上下文。这在处理 Web 请求时非常有用,因为您可以在处理请求期间轻松访问请求对象 (request)、会话对象 (session) 和其他上下文相关的信息。

  4. 线程和协程无关性:Flask 的 Local 对象在实现上并不依赖于特定线程或协程库。这意味着无论使用传统的多线程服务器还是协程库,Flask 的 Local 对象都能正常工作。

综上所述,Flask 的 Local 对象是一种强大的机制,它支持多线程和协程级别的数据隔离,确保了数据的安全和隔离性。这使得 Flask 在不同的并发环境下都能提供卓越的性能和可靠性,从传统多线程服务器到协程库都能很好地运行。

Q3::LocalStack对象的作用?

Flask 中LocalStack 对象的主要功能是Local 对象中的数据进行操作,同时维护这些 Local 对象成一个栈的形式。这个栈的结构允许在不同上下文之间进行推入(push)和弹出(pop)操作,从而实现数据的隔离和切换。

深入分点来说就是:

  1. 栈结构: LocalStack 是一个栈(stack)数据结构,每个元素都是一个 Local 对象。在多线程或协程环境中,每个 Local 对象都用于存储特定上下文的数据。这些 Local 对象按栈的方式组织,最近的上下文数据存储在栈的顶部。

  2. 数据操作: 操作 LocalStack 时,您可以推入(push)一个新的 Local 对象到栈顶,也可以弹出(pop)栈顶的 Local 对象。推入新的 Local 对象通常在进入新的上下文(例如请求处理过程)时发生,而弹出则在离开该上下文时发生。这种推入和弹出操作允许您切换不同上下文之间的数据存储。

  3. 数据隔离: 由于每个 Local 对象都是线程或协程本地的,栈的结构确保了数据的隔离。每个上下文都有自己的数据存储,不会干扰其他上下文的数据。这对于在处理并发请求时确保数据不会混淆时非常有用。

  4. 上下文切换: 使用 LocalStackLocal 对象,Flask 能够实现上下文的切换。在多线程或协程环境中,不同上下文之间的数据切换是必要的,以便处理不同请求时可以访问正确的数据,如请求对象和会话数据。

可见,LocalStack 非常牛p,它使用栈结构来维护多个 Local 对象,实现数据的隔离和上下文切换。这对于构建高性能、多线程或协程支持的 Web 应用程序非常有用,确保在不同上下文之间数据正确隔离,从而保证数据安全和一致性。LocalStack 是 Flask 处理多上下文数据隔离的关键工具。

形如下述结构:
【其中1234是线程唯一ID】

Local = {
	1234: {stack: [ctx3, ctx2, ctx1]
}

Q4:一个运行中的Flask应用程序分别包括几个Local/LocalStack?

两个,一个Request Context(请求上下文):request&session;一个Application Context(应用上下文):app&g。

Q5:什么是g?

在 Flask 中,“g” 是一个特殊的对象,通常用于在同一请求处理周期内共享数据。它是一个全局对象,被称为 “request context”(请求上下文)中的 “g” 对象。 “g” 通常用于存储在一个请求处理过程中需要在不同函数之间共享的数据,而不必传递给每个函数的参数。

“g” 对象在请求处理过程中非常有用,因为在一个请求中的不同视图函数(函数处理不同的请求路径)之间,开发者可能需要共享某些数据。举例来说,我们可能需要在处理请求的不同函数中存储用户身份信息、数据库连接、或其他全局数据。

在 Flask 中,我们可以使用 “g” 对象来存储这些数据,以便在同一请求处理周期内跨不同函数进行访问和共享。这是一种避免通过参数传递数据到每个函数的方法,而可以更方便地在函数之间共享数据。

Q6:视图函数中使用的session/g/current_app/request在Flask源码中流程是什么样的?

这个问题我希望读者自行给出答案(如果脑子中第一时间没有清晰的数据流,那么请再细细缕一遍第二十一篇文章!!!)

Q7:一些Python中重要技术栈相关可能会问到的面试点

  1. 讲一下Python中的反射,并举一些Python中反射的一些常见用法:

    Python 中的反射是指通过变量名(通常是字符串)来访问、调用、创建和修改变量、函数、类和模块。反射是一种动态编程技术,允许您在运行时根据字符串的值来操作程序的结构。

    举一些 Python 中的反射的一些常见用法:

    • 访问对象的属性和方法: 可以使用反射来访问对象的属性和方法。例如,如果有一个对象 obj,我们可以使用字符串来访问它的属性或调用它的方法,如 getattr(obj, 'attribute_name')getattr(obj, 'method_name')
    • 创建对象的实例: 反射还可以用于通过类名来创建类的实例。例如,可以使用 globals() 函数来获取全局命名空间中的类,然后使用字符串类名来创建该类的实例。
    • 导入模块: 反射可用于导入模块。可以使用 importlib 模块的 import_module 函数,根据字符串模块名导入模块,然后访问其内容。
    • 修改对象的属性和方法: 反射也可以用于修改对象的属性值或方法。例如,可以使用 setattr(obj, 'attribute_name', new_value) 来修改对象的属性值。
    • 查看对象的成员列表: 可以使用内置函数 dir(obj) 来查看对象的成员列表,包括属性、方法、特殊方法等。这可以帮助了解对象的结构。
    • 动态选择函数和方法: 根据字符串值来选择调用的函数或方法是一种常见的反射用法。例如,根据用户输入的命令字符串来选择执行不同的函数。

    反射是一种强大的编程技巧,但需要谨慎使用,因为它会使代码更加动态和难以维护。不当使用反射可能会导致安全漏洞和不可预测的行为。因此,应该在需要时慎重使用反射,确保输入数据的有效性和安全性。

    结合Flask提一嘴,在Flask视图函数中可以直接拿到使用的request/session/g/current_app,它们的获取也是主要借助于反射实现的:

    在这里插入图片描述

  2. 如果问有关于Python的双下划线魔术方法相关,就想LocalProxy类,它都有!!!

  3. 如果问到线程相关,一定不要忘记说threading.local对象(你懂的~)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

能为企业节省巨额成本的稳定性测试!你确定不来看看吗?

首先来说说性能测试: 性能是软件的一种非功能特性,他关注的不是软件是否完成了特定的功能,而是软件在完成特定功能是展示出来的及时性。 及时性从不同的视角代表不同的指标: 用户:响应时间 系统管理员:资…

20240223-2092.查找所有有秘密的人

题目要求 给你一个整数 n,表示有 n 个人,编号从 0 到 n - 1。你还给你一个 0 索引的二维整数数组 meetings,其中 meetings[i] [xi, yi, timei] 表示 xi 和 yi 在 timei 有一个会议。一个人可以同时参加多个会议。最后,给你一个整…

用Python Matplotlib画图导致paper中含有Type-3字体,如何解决?

用Python Matplotlib画图导致paper中含有Type-3字体,如何解决? 在提交ACM或者IEEE论文之前,都会有格式的检查,格式的其中一个要求是paper中不能含有Type-3的字体。因为Type-1和True Type字体都是矢量字体,而Type-3并不…

工控网关在智能制造领域的应用与实践-天拓四方

随着工业4.0和智能制造的深入推进,工控系统作为连接管理层与执行层的关键纽带,其智能化、网络化水平日益成为衡量企业现代化程度的重要标志。工控网关作为实现工控系统内外信息交互的“智能桥梁”,在提升工业控制网络的连通性、安全性和智能化…

第3集《灵峰宗论导读》

《灵峰宗论》导读。诸位法师,诸位同学,阿弥陀佛!(阿弥陀佛!) 请大家打开讲义第5面,悟道。 这一科我们是说明论主略史,在这一科当中,我们根据弘一大师所编的《蕅益大师年…

【Linux运维系列】vim操作

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C++ QT项目5】——基于HTTP与JSON数据流的天气预报界面设计

【C QT项目5】——基于HTTP与JSON数据流的天气预报界面设计 一、项目概述二、UI设计与stylesheet样式表三、天气预报数据接口四、JSON数据4.1 概述4.2 QT生成JSON数据4.3 QT解析JSON数据4.4 将JSON数据解析到QMap中 五、软件开发网络通信架构5.1 BS架构/CS架构5.2 HTTP基本概念…

Vi/Vim 使用小窍门,如何消除搜索后的关键字高亮

Vim/Vi 基本上是 *nix 世界最受欢迎的编辑器了,不知道为什么,一直以来觉得和 Emacs 比起来,Vim 更加有亲和力。用起来很舒服。 今天就记录一个困扰了我很久的问题。 大家应该都知道,在 Vi 里面如果要搜索某个关键字,…

2024国际生物发酵展览会不容错过-欧瑞安电气

参展企业介绍 山东欧瑞安电气有限公司成立于2013年,坐落于泰山脚下的泰安国家高新区,是国家高新技术企业、国家专精特新“小巨人”企业、中国产学研合作创新示范企业、山东省“隐形冠军”企业、山东省技术创新示范企业、山东省高端品牌培育企业、山东省…

Mac使用K6工具压测WebSocket

commend空格 打开终端,安装k6 brew install k6验证是否安装成功 k6 version设置日志级别为debug export K6_LOG_LEVELdebug执行脚本(进入脚本所在文件夹下) k6 run --vus 100 --duration 10m --out csvresult.csv script.js 脚本解释&…

免费分享一套SpringBoot+Vue实验室(预约)管理系统,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue实验室(预约)管理系统 ,分享下哈。 项目视频演示 【免费】SpringBootVue实验室(预约)管理系统 Java毕业设计_哔哩哔哩_bilibili【免费】SpringBootVue实验室(预约)管理系统 Java毕…

【深度学习笔记】3_11 模型选择、欠拟合和过拟合

注:本文为《动手学深度学习》开源内容,做了部分个人理解标注,仅为个人学习记录,无抄袭搬运意图 3.11 模型选择、欠拟合和过拟合 在前几节基于Fashion-MNIST数据集的实验中,我们评价了机器学习模型在训练数据集和测试数…

【前端】nginx 反向代理,实现跨域问题

前面讲跨域的问题,这篇 C# webapi 文章里面已经说过了。在上述文章中是属于从服务器端去允许访问的策略去解决跨域问题。而这里是从客户端的角度利用反向代理的方法去解决跨域问题。 反向代理:其原理就是将请求都接收到一个中间件(中间地址&a…

【SRE系列之Jenkins的使用】--实现ssh和http克隆

1、Jenkins的概念 1.1Jenkins的介绍 Jenkins是一个独立的开源软件项目,是基于Java开发的一种CI(Continuous integration,持续集成) &CD (Continuous Delivery,持续交付)工具,用于监控持续重复的工作&a…

深入浅出JVM(十二)之垃圾回收算法

上篇文章深入浅出JVM(十一)之如何判断对象“已死”已经深入浅出的解析JVM是如何评判对象不再使用,不再使用的对象将变成“垃圾”,等待回收 垃圾回收算法有多种,适用于不同的场景,不同的垃圾收集器使用不同…

Matlab自学笔记二十七:详解格式化文本sprintf各参数设置方法

1.一个程序引例 上篇文章已经介绍了格式化文本的初步应用,程序示例如下: sprintf(|%f\n|%.2f\n|%8.2f,pi*ones(1,3)) 2.格式化操作符各字段的含义解析 格式化操作符可以有六个字段,只有主字符%和转换格式是必需的,其他都是可选…

DWT硬件延时

DWT硬件延时 文章目录 DWT硬件延时软件&硬件延时方案软件延时硬件延时方案 DWT硬件延时方案DWT硬件延时方案DEMCR寄存器DWT硬件延时方案实现延时初始化:US延时:MS延时: 软件&硬件延时方案 软件延时 static void Delay(uint32_t cou…

Sora抢饭碗!好莱坞大亨停止8亿美元投资

好莱坞消息,著名演员、影视投资人Tyler Perry在看到OpenAI最新发布的文生视频模型Sora后,停止了8亿(约57亿元)美元的投资。 该投资项目位于亚特兰大,本来要扩展十几个摄影棚用于影视剧的拍摄(类似横店影视…

企业微信主体怎么转让给别人?

企业微信变更主体有什么作用?当我们的企业因为各种原因需要注销或已经注销,或者运营变更等情况,企业微信无法继续使用原主体继续使用时,可以申请企业主体变更,变更为新的主体。企业微信变更主体的条件有哪些&#xff1…

C++笔记(面对对象部分复习向)

B站:黑马程序员C教程 栈区,全局区,堆区和代码区 析构、构造和static 对象成员与类本身构造顺序,先成员后自己;析构则相反 static修饰成员变量,所有对象共享一份内存,编译阶段分配内存,类内声明…
最新文章