版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Flask高频面试题及详细答案(实战版)一、Flask基础认知类1、简单说一下你对Flask的理解,它和Django、FastAPI有什么区别?Flask是Python轻量级的Web微型框架,核心特点是精简、灵活、自由度高,只保留了Web开发最基础的核心功能,比如路由、模板渲染、请求响应处理,其他数据库、表单验证、权限、后台管理等功能都需要通过第三方扩展实现。和其他框架的核心区别:1.Django是全能型框架,内置ORM、后台管理、表单、缓存、权限等全套功能,开箱即用,适合快速开发大型完整项目,但耦合度高,自定义改造成本高;2.Flask是微框架,轻量化、低耦合、扩展性强,适合中小型项目、接口开发、快速原型搭建,缺点是复杂项目需要自己搭配扩展,架构需要自己规范;3.FastAPI是高性能异步框架,主打异步接口、自动接口文档,适合高并发接口服务,而Flask默认是同步框架,并发能力相对弱一些。2、Flask的核心组件有哪些?常用第三方扩展你用过哪些?原生核心组件只有三个:路由系统、Jinja2模板引擎、Werkzeug请求处理库,这也是Flask的核心底层支撑。工作中常用的扩展:1.Flask-SQLAlchemy:数据库ORM操作,替代原生SQL,简化数据库读写;2.Flask-Migrate:数据库迁移工具,配合SQLAlchemy实现表结构更新、版本管理;3.Flask-Login:用户登录态管理,实现登录校验、会话保持、权限拦截;4.Flask-JWT-Extended:前后端分离项目的令牌认证,实现无状态登录;5.Flask-CORS:解决前后端跨域请求问题;6.Flask-Session:服务端会话存储,替代默认的cookie会话;7.Flask-Limiter:接口限流,防止接口恶意刷请求。3、Flask中蓝图(Blueprint)的作用是什么?什么时候用?蓝图是Flask用来拆分项目模块、解耦路由的核心工具。单文件Flask项目适合小型demo,但项目变大后,所有路由、视图函数堆在一个文件里,代码混乱、不好维护。通过蓝图可以把项目按业务模块拆分,比如用户模块、订单模块、登录模块、后台管理模块,每个模块单独创建蓝图,各自管理自己的路由、模板、静态资源。核心作用:1.实现项目模块化,代码结构清晰,便于多人协作开发;2.统一模块路由前缀,比如所有用户接口统一加/user前缀;3.支持单独注册模板、静态文件、拦截器,模块独立性更强;4.方便项目功能复用,不同项目可以直接移植对应的蓝图模块。二、路由与请求响应核心4、Flask路由匹配原理是什么?支持哪些路由参数写法?Flask底层基于Werkzeug的路由规则,采用正则匹配机制。我们通过@app.route()装饰器注册路由时,框架会把URL规则和对应的视图函数绑定到路由映射表中,客户端请求进来后,框架遍历路由表,通过正则匹配找到对应的视图函数执行。支持的路由参数类型:1.字符串默认类型:<string:name>,匹配普通字符串,不包含斜杠;2.整型:<int:id>,只匹配数字,常用于ID、页码;3.浮点型:<float:price>,匹配浮点数;4.路径类型:<path:url>,可以匹配带斜杠的完整路径;5.UUID类型:<uuid:uid>,匹配唯一UUID字符串。5、Flask中request对象常用属性有哪些?request是全局请求对象,用来获取客户端所有请求信息,工作中高频使用的属性:1.request.method:获取请求方式(GET/POST/PUT/DELETE);2.request.args:获取GET请求的URL参数,返回类字典对象;3.request.form:获取POST表单提交的参数;4.request.json:获取前端传的JSON格式参数,前后端分离项目最常用;5.request.files:获取上传的文件对象,用于文件上传接口;6.request.headers:获取请求头信息,比如token、User-Agent;7.request.remote_addr:获取客户端请求IP地址。6、return返回字符串、render_template、jsonify有什么区别?1.直接return字符串:最基础的响应方式,返回纯文本内容,响应头默认是text/plain,适合简单接口测试;2.render_template:专门用于渲染前端HTML模板,返回完整的网页页面,响应头为text/html,适用于服务端渲染项目,支持传入变量、模板继承;3.jsonify:专门用于前后端分离接口,会自动将字典转为标准JSON格式,设置正确的application/json响应头,还能自动处理编码、格式缩进,前端可以直接解析,是接口开发的主流返回方式。三、请求上下文与会话机制7、讲讲Flask的请求上下文和应用上下文Flask为了保证多线程、多请求环境下数据隔离,设计了两大上下文,所有全局对象都是基于上下文实现的,避免请求之间数据错乱。应用上下文(appcontext):绑定应用实例,生命周期贯穿整个请求,存储当前应用的配置、全局变量。常用对象:current_app、g。请求上下文(requestcontext):绑定单次客户端请求,请求到来时创建,请求结束销毁。常用对象:request、session。日常开发中我们直接使用request、session不用传参,就是因为上下文自动推入、弹出。如果在视图函数外使用这些对象,需要手动withapp.app_context()、withapp.test_request_context()手动激活上下文。8、Flask中session和cookie的区别?默认session存在哪里?1.存储位置:cookie存在客户端浏览器,session默认加密后存储在客户端cookie中,开启Flask-Session后可以存到服务端redis、数据库;2.安全性:cookie直接暴露在客户端,可被篡改、窃取;原生session经过密钥加密,相对安全,但客户端依然可以获取加密后的内容;3.大小限制:cookie有大小限制,不能存储大量数据;服务端session无客户端限制;4.用途:cookie一般存储少量非敏感信息,session用于存储用户登录态、敏感会话信息。Flask原生session默认存在客户端cookie中,并非服务端,这是和Django最大的区别,生产环境一般都会改用redis存储服务端session。9、Flask全局g对象的作用是什么?和session、current_app的区别?g是单次请求的全局临时对象,生命周期仅当前一次请求,请求结束自动清空。核心用途:在一次请求的多个函数、多个装饰器之间传递数据,比如在拦截器中获取用户信息,存入g,后续视图函数直接取用,不用重复查询数据库。三者区别:1.g:单次请求临时数据,请求结束销毁;2.session:跨请求会话数据,保存用户登录状态,浏览器关闭或过期才失效;3.current_app:整个应用全局数据,所有请求共享,应用运行期间一直存在。四、数据库与ORM相关10、SQLAlchemy中session的增删改查用法,以及事务怎么处理?基础增删改查:1.新增:db.session.add(模型对象),再mit();2.查询:模型类.query.all()、get(主键)、filter(条件).first()/all();3.修改:先查询出对象,直接修改对象属性,再commit;4.删除:db.session.delete(对象),再commit。事务处理:SQLAlchemy默认开启事务,执行操作后必须commit才会写入数据库。如果出现异常,需要手动rollback回滚,避免数据脏数据。开发规范:所有数据库写入操作,都要加try-except捕获异常,失败则回滚并抛出异常。11、SQLAlchemy惰性加载是什么?会出现什么问题?怎么解决?惰性加载就是默认不查询关联表数据,只有访问关联属性时,才会再次发起SQL查询。一对多、多对一关联默认都是惰性加载。常见问题:N+1查询问题。比如查询10条用户数据,遍历用户读取关联的订单,会先查1次用户表,再循环查10次订单表,总共11次SQL查询,数据量大时严重影响接口性能。解决方案:使用主动加载,通过joinedload(连表查询)、contains_eager提前关联查询,一次性查出所有数据,避免多次查询。12、Flask-Migrate迁移原理,常用命令有哪些?Flask-Migrate基于Alembic实现,会记录数据库版本日志,对比模型和数据库表结构的差异,自动生成迁移脚本,实现表结构升级,且不会清空原有数据。常用核心命令:1.flaskdbinit:初始化迁移文件夹,只执行一次;2.flaskdbmigrate-m"备注信息":检测模型变化,生成迁移脚本;3.flaskdbupgrade:执行迁移脚本,更新数据库表结构;4.flaskdbdowngrade:回滚上一次迁移版本。五、拦截器、装饰器与异常处理13、Flask常用的请求钩子有哪些?执行顺序是什么?请求钩子就是全局拦截器,用于统一处理所有请求,核心四个:1.before_first_request:项目启动后第一次请求执行(新版本已废弃);2.before_request:每次请求进入视图函数之前执行,常用于登录校验、权限拦截、参数统一处理;3.after_request:视图函数执行完毕、返回响应之前执行,可统一修改响应头、统一返回格式;4.teardown_request:每次请求结束、响应完成后执行,无论是否报错都会执行,常用于资源释放、日志记录。执行顺序:before_request→视图函数→after_request→teardown_request。14、怎么实现Flask接口统一异常处理和统一返回格式?通过@app.errorhandler()装饰器捕获全局异常,自定义异常处理函数。实际项目中会封装统一的成功、失败返回格式,所有接口统一返回code、msg、data结构。同时捕获系统异常、自定义业务异常,避免前端收到500原生错误页面,统一返回标准化JSON错误信息。好处:前端对接更规范,后端日志统一,便于问题排查。15、Flask路由装饰器和普通Python装饰器有什么区别?使用注意事项?Flask的路由装饰器是基于Werkzeug实现的,核心作用是注册路由规则,绑定URL和视图函数。注意事项:如果自定义权限、登录校验装饰器,必须放在路由装饰器下方。因为装饰器执行顺序是由下至上,放错位置会导致拦截失效、请求未校验就进入视图。六、项目部署与性能优化16、Flask为什么不能直接用内置服务器上线生产?Flask内置的run()启动的服务器,只是轻量化调试服务器,仅适用于开发测试环境。缺陷:1.单线程单进程,无法处理高并发请求;2.没有安全防护,稳定性差,容易崩溃;3.不支持热重启、日志管理、负载均衡。生产环境必须搭配Gunicorn/uWSGI部署,配合Nginx做反向代理、负载均衡、静态资源分发。17、Gunicorn部署Flask的核心参数有哪些?1.workers:进程数,一般设置为CPU核心数*2+1;2.worker_class:工作模式,常用gevent异步模式,提升并发;3.bind:绑定IP和端口;4.timeout:超时时间,防止请求卡死;5.daemon:守护进程模式,后台运行。18、你做过哪些Flask项目性能优化?1.数据库优化:添加索引、避免N+1查询、分页查询、减少全表扫描;2.缓存优化:用Redis缓存高频查询数据、登录态、接口结果,减少数据库访问;3.并发优化:生产使用Gunicorn+gevent异步部署,替代原生服务;4.代码优化:全局参数校验、减少重复数据库查询、利用g对象复用单次请求数据;5.接口优化:接口限流、资源压缩、静态资源交由Nginx处理;6.日志优化:分级日志记录,线上关闭debug模式,减少日志冗余。七、高频手写面试题19、手写一个Flask蓝图拆分项目结构核心步骤:创建蓝图对象、注册路由、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农业岗2026结构化面试模拟练习含答案解析
- 星形细胞瘤的MRI诊断与鉴别诊断
- 2026年校招:互联网架构师笔试题及答案
- 2026年校招:活动策划试题及答案
- 中医治疗痛风的中医治疗
- 疝修补材料类型、临床应用
- 诊断学心脏及血管检查重点
- 2026年校招:广州环投集团笔试题及答案
- 消化系统疾病患者的健康评估
- 班会主题:美丽心灵
- 高中美术鉴赏课教学设计:以作品为本位的四步鉴赏法实践
- 2025年城管协管员笔试考试试题(含答案)
- 医疗健康管理与慢病防控
- 2026年认证基础、管理体系认证基础主观题考试(附答案)解析
- 七年级上册人教版英语第一次月考试卷(含答案)
- 2026年急诊超声应用培训课件
- 正压送风口阀体损坏更换安装调试方案
- 2026中考冲刺-九年级数学知识点梳理
- 新学期(2026年秋)小学二年级体育教学工作计划
- 浙江省杭州市2026届高三上学期教学质量检测数学试卷(杭州一模)(含答案)
- 第二届重庆市市场监管系统执法办案电子数据取证技能大竞赛赛完整试题
评论
0/150
提交评论