(二十三)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.mzph.cn/news/707773.shtml

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

相关文章

若依前后端分离版开源项目学习

前言:vscode中vue代码没有高亮显示,可以下载vetur插件解决,ctrl点击无法跳转函数定义问题,可以下载vue-helper插件解决;idea中ctrl点击函数即可跳转函数定义。 一、登录 1.生成验证码 基本思路: 后端生…

vue a-table 实现指定字段相同数据合并行

vue a-table 实现相同数据合并行 实现效果代码实现cloums数据格式数据源格式合并代码 实现效果 代码实现 cloums数据格式 const getColumns function () {return [{title: "分类",dataIndex: "checked",width: "150px",customRender: (text, …

JMeter--9.录制脚本

录制步骤 1.新建线程组:测试计划->线程->线程组 测试计划下,至少要有1个线程组,因为在录制器中需要选择【目标控制器】 2. 新建录制器:测试计划->非测试原件->HTTP(S)测试脚本记录器(HTTP代理服务器&…

【vue】vue2 和 vue3 的区别,响应式/性能提升/渲染函数/插槽

vue2/vue3 的对比 响应式原理 vue2 使用 definePropertyvue3 使用 proxyapi vue2 是选项式 options API 基于对象的方式,将组件的选项 data,methods 等作为组件实例属性代码逻辑比较复杂,难以维护data 必须是函数使用 mixin 复用相同逻辑 命…

Ansible自动化运维(四)jinja2 模板、Roles角色详解

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

PHP7.3 GD库报错imagecreatefromstring(): No JPEG support in this PHP build

最近在做docker容器的时候遇到了问题,安装的GD库没有JPEG支持,因为项目用到了绘图技术,这个支持必不可少。要解决这个问题也很简单: 安装jpeg支持,重新编译gd库,生成gd.so文件,重新加载gd库扩展…

Springboot+vue的考务报名平台(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的考务报名平台(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的考务报名平台,采用M(model&#xff0…

vue2后台管理系统demo,包含增删查改、模糊搜索、分页

因一直敲小程序,vue不熟练,自己练手项目,就包含增删查改以及模糊搜索分页 一、页面简单但功能齐全 二、数据是mock模拟 三、启动步骤 1、 json-server --watch data.json 启动mock数据 2、npm i 下载依赖 3、npm run serve 四、github地址…

ETH网络中的账户

ETH网络中的账户 Externally owned accounts (EOA) - 外部账户 由用户控制,我们导入助记词创建的账户就属于此类账户。 Contract accounts (smart contracts) - 合约账户 合约账户由以太坊虚拟机执行的代码控制。它也被称为智能合约。合约帐户有相关的代码和数据存…

Redis的高性能之道

前言:做码农这么多年,我也读过很多开源软件或者框架的源码,在我看来,Redis是我看过写得最优美、最像一件艺术品的软件,正如Redis之父自己说的那样,他宁愿以一个糟糕的艺术家身份而不是一名好程序员被别人记…

python opencv比较图片相似度

目录 一:均值哈希算法 二:三直方图算法 三:单通道直方图 一:均值哈希算法 均值哈希算法是一种快速比较图像相似度的方法。它首先将图像转化为灰度图像,然后计算图像的均值,接着将每个像素的

探索AI视频模型的无限可能:OpenAI的Sora引领创新浪潮

文章目录 📑前言一、技术解析二、应用场景三、未来展望四、伦理与创意五、用户体验与互动🌤️总结 📑前言 随着人工智能技术的蓬勃发展,AI视频模型正逐渐成为科技领域的新宠。在这个变革的浪潮中,OpenAI推出的首个AI视…

算法沉淀——动态规划之回文串问题(上)(leetcode真题剖析)

算法沉淀——动态规划之回文串问题 01.回文子串02.最长回文子串03.分割回文串 IV04.分割回文串 II05.最长回文子序列06.让字符串成为回文串的最少插入次数 01.回文子串 题目链接:https://leetcode.cn/problems/palindromic-substrings/ 给你一个字符串 s &#xf…

雾锁王国服务器官方配置要求说明

雾锁王国/Enshrouded服务器CPU内存配置如何选择?阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置,支持4人玩家畅玩,自带10M公网带宽,1个月90元,3个月271元,幻兽帕鲁服务器申请页面 https://t.aliyun.com…

C# TCP/IP协议

在C#中编写TCP/IP通信 //开启监听各个网络的连接是否成功 //开启服务端,监听,并且进入监听线程 try { IPAddress ip IPAddress.Parse(HostAddress); IPEndPoint ipe new IPEndPoint(ip, HostPort); m_services new Socket(Add…

深入JVM:解析OOM的三大场景,原因及实战解决方案

在Java应用程序开发中,OutOfMemoryError(OOM)是一个令人头痛的问题。当JVM中的内存无法满足应用程序的需求时,就会抛出这个错误。本文将深入探讨OOM的三大场景:堆内存溢出、方法区内存溢出和栈内存溢出,并分…

ChatGPT能替代什么人?

上一讲关于ChatGPT的热炒,其实对于我们来说算是敲了敲警钟。 其实在今天,关于ChatGPT,最多人关注的一个问题就是:ChatGPT能取代人吗,或者说能抢人的饭碗么吗? 有人说不能,也有人说能&#xff…

代码随想录算法训练营day30 || 332.重新安排行程(未完成),51. N皇后,37. 解数独(未完成)

这就是传说中的N皇后&#xff1f; 回溯算法安排&#xff01;| LeetCode&#xff1a;51.N皇后_哔哩哔哩_bilibili // 时间复杂度O(n^2) // 空间复杂度O(n^2)class Solution {List<List<String>> res new ArrayList<>();public List<List<String>>…

【机器人最短路径规划问题(栅格地图)】基于蚁群算法求解

基于蚁群算法求解机器人最短路径规划问题的仿真结果 仿真结果 收敛曲线变化趋势 蚁群算法求解最优解的机器人运动路径 各代蚂蚁求解机器人最短路径的运动轨迹

Java+SpringBoot+Vue:瑜伽馆管理的黄金组合

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…