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

news/2024/4/15 15:05:50

目录:

  • 每篇前言:
    • 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.ppmy.cn/news/1366281.html

相关文章

第三节-docker-cs架构分析

一、组成 docker engine:docker-client、rest-api、dockerd containerd: 1、管理容器生命周期 2、拉取/推送镜像 3、存储管理 4、调用runc 5、管理网络 containerd-shim:相当于一个驱动,containerd通过containerd-shim驱使…

ZCC5429 异步升压芯片

一、产品综述 ZCC5429 芯片是一款自动调频、最高 600KHz 工作频率、高效率、宽输入电压范围的电流模式异步升压(BOOST)芯片,且可调输入限流功能。用户可灵活地通过外部补偿建立动态环路,获得在所有条件下最优瞬态性能。 ZCC5429…

面试数据库篇(mysql)- 02定位慢查询和分析

定位慢查询 聚合查询多表查询表数据量过大查询深度分页查询表象:页面加载过慢、接口压测响应时间过长(超过1s) 方案一:开源工具 调试工具:Arthas 运维工具:Prometheus 、Skywalking 方案二:MySQL自带慢日志 慢查询日志记录了所有执行时间超过指定参数(long_query_tim…

【JS】数值精度缺失问题解决方案

方法一: 保留字符串类型,传给后端 方法二: 如果涉及到计算,用以下方法 // 核心思想 在计算前,将数字乘以相同倍数,让他没有小数位,然后再进行计算,然后再除以相同的倍数&#xff0…

allure结合python生成测试报告教程

这篇文章主要介绍了allure结合python生成测试报告教程,具有很好的参考价值,希望对大家有所帮助。 百度搜索实例 一、代码结构 data.yml为数据管理文件,test_baidudemo.py为测试用例文件,文件结构如下: 创建data/dat…

异常网络下TCP的可靠服务机制(慢启动、拥塞避免、快重传、快恢复)

目录 TCP超时重传拥塞控制概述慢启动和拥塞避免下面讲解发送端如何判断拥塞发生。 快速重传和快速恢复 本文描述TCP在异常网络下的处理方式 以保证其可靠的数据传输的服务 TCP超时重传 tcp服务能够重传其超时时间内没有收到确认的TCP报文段,tcp模块为每一个报文段都…

Redisson限流算法

引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.12.3</version> </dependency>建议版本使用3.15.5以上 使用 这边写了一个demo示例&#xff0c;定…

笑营宝高校选修课报名考勤系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着高等教育的普及和教学模式的不断创新&#xff0c;高校选修课程体系日趋复杂多变。学生对课程选择的自由度提高&#xff0c;使得传统的选课和考勤管理方式变得繁琐且效率低下。目前&#xff0c;许多高校仍然采用纸…

vue构建版本

完整版&#xff1a;同时包含编译器和运行时的版本。 编译器&#xff1a;用来将模板字符串编译成为 JavaScript 渲染函数的代码。 运行时runtime&#xff1a;用来创建 Vue 实例、渲染并处理虚拟 DOM 等的代码。基本上就是除去编译器的其它一切。 UMD&#xff1a;UMD 版本可以…

计算机网络-网络互连和互联网(四)

1.TCP协议&#xff1a; 传输控制协议&#xff0c;面向字节流按顺序连接&#xff0c;可靠&#xff0c;全双工&#xff0c;可变滑动窗口&#xff0c;缓冲累积传送。协议号为6。下面是TCP段&#xff08;段头&#xff09;&#xff0c;TCP头&#xff08;传输头&#xff09;&#xf…

linux下golang环境配置问题记录

vscode工具&#xff0c;golang-dlv 调试&#xff0c;爆出&#xff1a; GOPATH set to GOROOT (/usr/local/go) has no effect解决方案&#xff1a;环境配置PATH&#xff0c;需要包含GOPATH和GOROOT/bin 工具箱默认放在GOPATH目录下。 export GOROOT/usr/local/go export GOPA…

使用Qt Creator写C++代码常用的快捷键总结

1.F2 &#xff08;1&#xff09;将鼠标放在某个函数声明处的函数名上&#xff0c;按F2可转到该函数的定义处。相反&#xff0c;将鼠标放在函数定义处的函数名上&#xff0c;按F2可以转到该函数的声明处。 &#xff08;2&#xff09;将鼠标放在某个自定义类的类名上&#xff0c…

windows通过nginx反向代理配置https安装SSL证书

先看下效果&#xff1a; 原来的是 http&#xff0c;配置好后 https 也能用了&#xff0c;并且显示为安全链接。 首先需要 SSL证书 。 SSL 证书是跟域名绑定的&#xff0c;还有有效期。 windows 下双击可以查看相关信息。 下载的证书是分 Apache、IIS、Tomcat 和 Nginx 的。 我…

YOLOv8改进 | 独家创新篇 | 结合SOTA思想利用双主干网络改进YOLOv8(全网独家创新,最重磅的更新)

一、本文介绍 本文给大家带来的改进机制是结合目前SOTAYOLOv9的思想利用双主干网络来改进YOLOv8(本专栏目前发布以来改进最大的内容,同时本文内容为我个人一手整理全网独家首发 | 就连V9官方不支持的模型宽度和深度修改我都均已提供,本文内容支持YOLOv8全系列模型从n到x均可…

面试经典150题——合并区间

​"Do not wait to strike till the iron is hot; but make it hot by striking." - William Butler Yeats 1. 题目描述 2. 题目分析与解析 2.1 思路一 还是先来分析题目&#xff0c;观察一下重叠的区间和不重叠的区间数组之间的关系是什么&#xff1a; 比如区间…

前端-DOM树

dom树描述网页元素关系的一个专有名词&#xff0c;如html内包含了head、body&#xff0c;而head内包含meta、title、script等&#xff0c;body内包含div等元素&#xff1b;网页所有内容都在document里面&#xff0c;网页内容以树状形式排列&#xff0c;所以称之为dom树 dom树内…

华为OD技术面试案例2-2024年

软开C&#xff0c;机考满分&#xff0c;技术面面评两个A&#xff0c;时间线如下&#xff1a; 01.04 笔试链接 01.10 笔试(2.5h) 01.11 综测 01.13 资格面(HR面) 01.17 技术一面 01.19 技术二面 01.20 主管面 01.22 提Offer及审批 01.26 Offer邮件 笔试复盘 1.英文输入…

周鸿祎首堂免费课与千万网友分享“AGI趋势”

“我讲课不割韭菜&#xff0c;宗旨是免费、分享、科普、交流。AI时代技术发展迅速&#xff0c;AI知识普及尤为重要。”2月29日&#xff0c;360公司创始人周鸿祎免费课正式开启&#xff0c;全网多平台直播了AI系列第一讲“预见AGI”&#xff0c;千万网友观看。免费课上&#xff…

map和set的简单介绍

由于博主的能力有限&#xff0c;所以为了方便大家对于map和set的学习&#xff0c;我放一个官方的map和set的链接供大家参考&#xff1a; https://cplusplus.com/ 在初阶阶段&#xff0c;我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector、list、deque&#x…

一个实时波形图的封装demo(QT)(qcustomplot)

前言&#xff1a; 封装的一个实时波形图的类&#xff0c;可以直接提升使用。 提供了接口&#xff0c;可以更改颜色&#xff0c;样式&#xff0c;等等 参考&#xff1a; Qt Plotting Widget QCustomPlot - Introduction 另外参考了一个大神的作品&#xff0c;链接没找到。 项目…
最新文章