Flask05——请求钩子和异常捕获

Flask生产部署:Ubuntu 20.04下Gunicorn+Nginx+systemd完整实践 Web应用部署本质是组件职责的精确划分:Flask作为Python Web框架负责业务逻辑,Gunicorn作为WSGI服务器管理进程生命周期,Nginx承担反向代理与静态资源服务,systemd实现服务化治理。在Ubuntu 20.04这一主流LTS系统上,三者协同需规避常见陷阱——如flask run误用于生产、Unix socket权限错误、systemd日志未重定向、Nginx未透传HTTPS头等。本文聚焦可落地的最小可行配置集,覆盖进程隔离、热更新、健康检查、日志分级与资源约束等核心能力,适用于中 阅读详情


我们在写项目的时候往往会有一些全局性的需求,比如在应用启动之初初始化一些数据,建立数据库链接等。对发起的所有请求记录一些数据,对某些请求进行一些拦截。在请求结束的时候自定义响应数据等。

请求钩子

针对这些全局性的需求,flask框架提供了请求钩子,所谓请求钩子就是可以挂在请求和响应的不同阶段,进行植入,拦截一些操作。请求钩子以装饰器的形式作用到知道一点的函数上,被作用的函数内部可以自定义具体的操作。根据被装饰的请求钩子,这些被装饰的函数会在不同阶段被触发。下面介绍一下flask框架常用的三个请求钩子:

before_first_request:
在处理第一个请求前执行
before_request:
在每次请求前执行,如果在被装饰的函数中返回了一个响应,视图函数将不再被执行。
after_request:
如果没有抛出错误,在每次请求后执行
接受一个参数:此参数是视图函数作出的响应
在此函数中可以对响应值在返回之前做最后一步修改处理
需要将参数中的响应在这个被装饰的函数中进行返回

请求钩子执行先后顺序

我们下面同时定义一个视图函数index和三个被装饰的函数,分别在他们内部进行打印,然后看下他们的执行顺序。

@app.route('/')
def index():
    print('index')
    return 'Ok'


@app.before_first_request
def first():
    print('first')


@app.before_request
def every():
    print('every')


@app.after_request
def after(response):
    print('after')
    return response

启动之后请求index视图函数,在控制台可以看到执行顺序如下:

first
every
index
after
由此看出请求钩子的执行顺序为before_first_request->before_request->视图函数index->after_request

再次请求index视图函数,这次的在控制台看到的结果如下:

every
index
after
这次我们可以看到除了before_first_request这个钩子函数不被执行之外,别的顺序都没有变化。

也就验证了我们之前的说明,before_first_request钩子只在第一个请求前执行,befor_request在每次请求都执行,且在视图函数之前执行,after_request在视图函数执行之后执行,且要返回由视图函数传递过来的响应。

before_request的拦截作用

下面我们把before_request钩子作用的函数,改造成如下,看看会是什么结果。

@app.before_request
def every():
    print('every')
    return 'every'  # 如果返回结果,请求就直接从这里返回了,而不再执行视图函数了。

再次访问index视图函数,发现浏览器显示every字样。也同样验证了我们在上面的说明,如果before_request钩子作用的函数有返回值,就在此返回,不再执行视图函数了。

统计网站浏览次数

基于以上特性,我们可以利用before_first_request、before_request和session技术,来统计网站浏览次数。思路如下:

在before_first_request初始化变量并写入session,由于此钩子只在应用之初执行一次,所以不会重复初始化变量。然后,由于每次对网站的请求都会执行befor_request钩子,所以我们在其内部取到保存在session中的变量,并且每请求一次就累计1,这样就能起到统计网站整体的浏览次数的目的,我们可以在任意视图函数中从session中取到总的浏览次数,并显示出来。代码如下:

@app.route('/')
def index():
    return '总浏览量:' + str(session['sum'])  # 从session中取出总次数并打印


@app.before_first_request
def set_sum():
    session['sum'] = 0  # 初始化变量,并保存到session当中


@app.before_request
def add_sum():
    session['sum'] += 1  # 从session中取出总次数,每次请求都累计浏览总次数

运行以上代码,访问index视图函数,可以看到每次刷新页面,总次数都会增加,有了上面的额思路分析和代码注释我想大家应该能清晰透彻的理解这段代码的含义吧。

记录最后访问网站时间

下面我们利用after_request钩子能接收视图函数传递来的响应这一特性,在响应中将用户最后访问网站的时间记录到cookie里面。然后就可以在视图函数中,通过cookie拿到用户最后的访问时间,然后展示出来。这里要用到时间获取包,和转换时间格式的函数。记得引入datetime包。

# 引入datetime包
from datetime import datetime

@app.route('/')
def index():
    print('index')
    return '最后访问时间:' + str(request.cookies.get('time'))


@app.after_request
def record_login_time(response):
    response.set_cookie('time', str(datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
    return response

启动服务之后,访问index视图函数,每次刷新即会显示最后访问时间。

限制指定IP访问

下面结合before_request钩子的拦截特性,可以实现这样的需求,可以在before_request请求钩子内部判断客户端的地址,进行访问控制,当然我们如果是在本地测试,那么本地的客户端地址就是127.0.0.1所以我们可以来判断是否为此ip地址,如果是,就可以进行拦截,这样的话,当我们再请求index视图函数的时候,就已经不能访问了,被拦截在了befor_request钩子当中了。

@app.route('/')
def index():
    return 'index'


@app.before_request
def add_sum():
    ip = request.__dict__['environ']['REMOTE_ADDR']
    if ip == '127.0.0.1':
        return '不允许访问!'

验证一下,是不是已经不能访问index视图函数了?浏览器显示不允许访问字样即是验证成功。

异常捕获

下面再介绍一下异常捕获装饰器。一般我们在访问网站的时候,如果访问了一个不存在的URL,那么网站就会提示我们404错误,并告诉我们这个页面不存在,那么这个404页面在一个网站中是同一个页面,访问所有不存在的页面都会跳到此页面,那么这个是怎么做到的呢?下面我们同样可以用装饰器来实现。

@app.errorhandler(404)  # 传递需要捕获的状态码
def error(e):  # 将错误传递到被装饰的函数内部
    print(e)
    return '不存在的页面'  # 自定义的显示内容

此装饰器接收一个参数:http状态码。即表示我们要捕获的错误状态码,同时要把错误异常传递到被装饰的函数内部,此函数的返回结果即为我们在浏览器显示的内容。这时如果我们访问一个不存在的页面就会看到:不存在的页面。

Python异常处理实战:从崩溃报警到生产级韧性工程 在Python开发中,异常(Exception)是运行时程序与外部不确定性交互的核心机制,其本质并非错误本身,而是系统状态失配的信号。理解异常与错误(Error)的编译期/运行期分界,掌握try/except/else/finally的分层控制流设计,是构建高可用服务的基础能力。尤其在Web API、数据管道和定时任务等典型场景中,空值(None)、falsy值误用、异常类型混淆、缺少finally资源清理等问题,直接导致半夜告警、连接泄漏与雪崩故障。本文基于金融级Python后端实践,融合Python 3 阅读详情

相关推荐

机器学习模型Web API部署实战与优化指南

机器学习模型部署是将训练好的模型转化为实际应用的关键步骤,其中Web API因其标准化和易用性成为主流方案。通过HTTP协议,模型可以轻松集成到各种系统中,实现跨平台调用和弹性扩展。本文重点探讨了模型部署的核心技术,包括轻量级框架(如Flask/FastAPI)和高性能方案(如NVIDIA Triton),并结合实际案例展示了如何优化模型性能(如使用TensorRT加速)和容器化部署(如Docker和Kubernetes)。此外,还涵盖了生产环境中的关键配置、监控指标和故障排查技巧,帮助开发者从工程化角度提

weixin_33836874的博客 390

[flask]异常抛出和捕获异常

1、注册处理函数,将特定类型的异常与相应的处理函数绑定。2、在应用程序执行过程中,如果发生异常,Flask会寻找匹配的异常处理函数。3、匹配到异常处理函数后,控制权转移到异常处理函数,并执行相应的处理逻辑。5、异常处理函数可以根据需要进行自定义的异常信息返回、日志记录或其他操作。6、处理完异常后,Flask会返回相应的错误响应给客户端。

jojojojoi的博客 1435

MLOps生产实战:模型服务可观测性与弹性部署

机器学习模型服务化不是简单封装API,而是构建具备确定性、可观测性与弹性的生产级系统。其核心原理在于切断Notebook式开发的脆弱依赖,通过模型版本锚点、数据溯源机制和服务强类型契约保障交付可靠性;技术价值体现在故障分钟级定位、特征漂移实时感知、灰度发布可控回滚等关键能力;典型应用场景覆盖电商大促、金融风控、医疗AI等高可用要求严苛的业务系统。本文聚焦MLOps落地中最具挑战的可观测性设计、Gunicorn黄金参数调优、双缓冲特征服务及模型漂移防御等真实工程实践。

weixin_30664051的博客 632

flask全局异常捕获

global_exception.py配置。

qq_63431773的博客 471

Flask 学习-69.捕获异常钩子函数errorhandler

flask 运行请求出现异常时,会先触发对应的异常钩子,比如出现404时,会根据NotFound 异常类返回404状态码。 我们也可以根据捕获异常钩子errorhandler 来自定义异常的输出。

qq_27371025的博客 1292

flask高频面试题

Flask使用签名的cookie来存储会话数据。如何在Flask中处理跨域请求(CORS)?静态文件(CSS/JS/图片)无法加载。如何在Flask中处理数据库迁移?如何在Flask中实现用户认证?Flask应用无法连接到数据库。表单提交时出现CSRF验证错误。Flask如何处理文件上传?Flask如何处理表单验证?来获取上传的文件,并使用。Flask如何处理会话?请求超时导致应用无响应。数据库迁移时出现冲突。扩展来处理表单验证。

闲人编程的博客 1613

【Flask】Flask框架使用中异常捕获

abort 方法 抛出一个给定状态代码的 HTTPException,例如想要用一个页面未找到异常来终止请求,你可以调用 abort(404)。 参数: code – HTTP的错误状态码 abort(404) 只能抛出HTTP协议的状态码 errorhandler 装饰器 注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法 参数:code_or_exception – HTTP的错误状态码或指定异常 例如统一处理状态码为500的错误给用户友好的提示: @app.e

码农-Vax天道的时间宝藏 2935

5G核心网Framed Routing功能解析:基于PFCP的帧路由机制与多终端互联实践

5G核心网Framed Routing功能解析:基于PFCP的帧路由机制与多终端互联实践

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1468

flask Blueprint 错误拦截

flask如果app中定义了404的拦截方法 @app.errorhandler(404) def error(e): return render_template('error.html', name='app'), 404 那么如果在Blueprint中出现了404的情况会被引导全局的404,不会引导Blueprint定义的404上面。 可以通过在Blueprint抛出4

鶸者为何战斗 1345

生信分析服务MR孟德尔随机化单细胞测序转录组数据分析网络药理学

通过上述技术整合,可实现从基因-环境-疾病关联到药物机制解析的全链条研究,为疾病机制解析和药物研发提供新思路。结合,是当前生物信息学领域的前沿方法,尤其在疾病机制解析、靶点发现和药物研发中展现出巨大潜力。

matlabgoodboy的博客 1522

TSMaster如何用珠海创芯CAN卡实现高效CAN通信(附完整驱动安装指南)

本文详细介绍了如何使用TSMaster软件与珠海创芯CAN卡实现高效CAN通信,包括驱动安装、系统配置、ControlCAN.dll替换及TSMaster集成配置等关键步骤。通过实战指南和故障排除技巧,帮助工程师快速搭建稳定可靠的CAN通信测试环境,适用于汽车电子和工业控制等领域。

weixin_29201859的博客 482

Flask 请求钩子

为了让每个视图函数避免编写重复功能的代码,Flask 提供了通用设施的功能,即请求钩子。

qq_43629857的博客 867

ArcGIS拓扑面错误批量修改

在工作学习中经常会遇到拓扑修改的问题,当数据量巨大的时候会产生拓扑问题 当拓扑错误数量巨大时,人工逐一修改是不现实的,基于此利用gis自带工具箱实现拓扑面类错误的批量修改。 一、.常见拓扑错误的类型: 1面重叠 2空隙(绿色部分) 二、拓扑检查 1新建数据库-----新建数据集—导入数据. 2新建拓扑 3修改拓扑容差及名称 添加拓扑修改规则 完成拓扑检查-查看拓扑错误 三、拓扑批量...

qq_43173805的博客 3万+

flask学习记录05-flask中的请求钩子

感谢关注【测试开发萌货】,跟小孟一起来学习吧~这节是flask-视图函数及路由模块的最后一个章节,下一节将开始记录flask-模块相关的知识。请求钩子的作用请求钩子是通过装饰器的形式实现的,其目的就是避免写重复的代码.在客户端和服务器交互的过程中,做些准备工作和扫尾工作.flask中有哪些装饰器before_first_requestbefore_requestafter_requestteardown_request请求钩子该如何使用before_first_request处理第一个请求前执行只执行一次不

梦途的测开笔记 266

告别RXTX:SpringBoot集成jSerialComm实现更现代的串口通信(附完整代码对比)

本文详细介绍了如何从传统的RXTX库迁移到jSerialComm,实现SpringBoot项目中更现代的串口通信。通过对比两种技术的依赖配置、API设计和跨平台支持,展示了jSerialComm在简化部署、提升性能和增强稳定性方面的优势,并提供了完整的代码示例和实战经验。

weixin_42522964的博客 289

Mac本地部署OpenClaw:从零搭建企业级知识库AI助手

大语言模型(LLM)作为当前人工智能的核心技术,通过其强大的自然语言理解和生成能力,正在深刻改变信息交互方式。其原理是基于海量数据训练的深度神经网络,能够根据上下文预测并生成连贯文本。这一技术的核心价值在于,它能够作为智能中枢,理解和执行复杂指令,从而将通用AI能力转化为解决特定业务问题的生产力。在工程实践中,通过AI Agent框架(如OpenClaw)将LLM与外部工具和知识系统连接,是实现其价值的关键。这涉及到**本地部署**与**私有化**部署,以确保数据安全与成本可控。具体应用场景包括企业知识库问

weixin_33402252的博客 380

Flask(5)- 请求钩子与上下文

3.abort的使用 目标:可以使用abort抛出http状态码异常 文件: d03_abort.py 作用: 抛出异常http状态码 使用: # abort(http错误状态码) 4XX 5XX abort(404) 4.异常捕获处理 目标:可以使用errorhandler捕获异常 文件: d04_errorhandler.py 使用格式 @app.errorh...

君莫笑 276

18、AI在基础设施管理与运维中的应用及未来趋势

本文探讨了人工智能(AI)在基础设施管理和运维中的广泛应用,包括性能优化、成本节约、网络安全等多个场景。文章详细介绍了AI在不同领域的应用工具、实际案例以及面临的挑战,并展望了未来AI在基础设施管理中的发展趋势。此外,还分析了AI与Site Reliability Engineering(SRE)框架的结合优势,展示了AI如何提升运维效率和系统可靠性。

n7o8p的博客 149

Python---Flask--05--g对象和钩子函数

使用 from flask import g g对象 g对象是专门用来保存用户的数据的。 g对象在一次请求中的所有的代码的地方,都是可以使用的。 使用步骤: 1.创建一个utils.py文件,用于测试除主文件以外的g对象的使用 from flask import g # 引入g对象 def login_log(): print '当前登录用户是:%s' % g.username ...

weixin_30535043的博客 144

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1642

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Flask请求-响应循环

请求-响应循环 1.程序和请求上下文 Flask 使用上下文临时把某些对象变为全局可访问。 from flask import request @app.route('/') def index(): user_agent = request.headers.get('User-Agent') return '<p>Your browser...

Bob欧巴のblog 903

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

第十阶段 -- Flask框架05:【Flask高级03:钩子函数】

1. 钩子函数概念 在Flask中钩子函数是使用特定的装饰器装饰的函数。为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码。那么这种函数就叫做钩子函数。 2. 常见的钩子函数 1. before_first_request 处理项目的第一次请求之前执行。 from flask import Flask,request,session,current_app,u...

weixin_42375099的博客 412

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

AI智能证件照制作工坊监控体系:服务状态与请求日志查看教程

本文介绍了基于星图GPU平台自动化部署AI智能证件照制作工坊镜像的实践方法。该平台支持一键部署与高效运行,适用于本地化AI应用开发场景。通过集成轻量级监控体系,可实时查看服务状态与请求日志,实现对证件照生成任务的全流程追踪与运维管理,提升系统稳定性与可维护性。

weixin_42452483的博客 282

Flask+Heroku零成本部署算法模型实战指南

Web部署是机器学习落地的关键一环,其本质是将本地运行的Python算法封装为可通过HTTP访问的服务。核心原理在于利用WSGI服务器(如Gunicorn)桥接Web框架与云平台,实现请求响应闭环。技术价值体现在降低使用门槛、加速验证闭环、支撑轻量级业务场景。典型应用场景包括算法岗作品集展示、教学演示系统、业务部门自助分析工具及产线边缘AI应用。本文聚焦Flask与Heroku免费层的极简组合,深入解析模型加载策略、文件上传安全处理、内存优化技巧及冷启动应对方案,帮助开发者绕过Docker、Nginx等复杂

weixin_33937778的博客 373

Python服务与客户端通信实战:HTTP API设计与错误处理

HTTP API是现代Python系统间通信的基础范式,其核心在于遵循请求-响应模型、实现健壮的错误处理机制,并保障客户端与服务端之间的契约一致性。一个可投入生产的Python服务,不仅需支持RESTful接口设计和标准HTTP状态码语义,更需在超时控制、连接复用、JSON序列化容错、业务异常映射等细节上做显式处理。本文聚焦于最小可行服务(MVS)构建,以Flask为服务端、requests为客户端,深入解析Python服务、客户端通信两大关键热词所涉及的工程实践要点,覆盖健康检查、版本化路由、全局异常处理

weixin_33841722的博客 305

一封客户邮件如何变成完整档案:Macro 免录入 CRM 的关键机制拆解

Macro 是一个面向团队的统一工作区,把邮件、聊天、文档、任务、AI Agent、通话和客户管理(CRM)放在同一套数据模型里。它的 CRM 不靠人工填字段:团队成员每发出一封外部邮件,系统就自动建好联系人与公司记录;@提及任何记录时,相关上下文会在聊天、文档和任务中即时带出。本文从"回复一封陌生客户邮件"这个动作切入,拆解这套免录入客户管理背后的几个关键机制,最后给出适用边界的判断。 ##

gitblog_00501的博客 591
上一篇: Flask04——请求上下文和应用上下文
下一篇: Flask06——Jinja2模板引擎
零寂前端
博客等级 码龄11年 59粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值