flask中的常用装饰器

在这里插入图片描述

flask中的常用装饰器

Flask 框架中提供了一些内置的装饰器,这些装饰器可以帮助我们更方便地开发 Web 应用。以下是一些常用的 Flask 装饰器:

  1. @app.route():这可能是 Flask 中最常用的装饰器。它用于将 URL 路由绑定到一个 Python 函数,这个函数就是处理对应 URL 请求的视图函数。例如:

    @app.route('/')
    def home():
        return 'Hello, World!'
    

    在这个例子中,@app.route('/') 装饰器将根 URL (/) 绑定到了 home 函数。当用户访问应用的根 URL 时,home 函数就会被调用,并返回 “Hello, World!”。

  2. @app.before_request():这个装饰器用于注册在每次请求之前运行的函数。这对于需要在处理请求之前执行某些操作(如打开数据库连接、进行身份验证等)的情况非常有用。

    假设我们有一个 Flask 应用,我们想在每个请求开始之前检查用户是否已经登录。如果用户未登录,我们将重定向他们到登录页面。

    from flask import Flask, session, redirect, url_for
    
    app = Flask(__name__)
    
    @app.before_request
    def require_login():
        allowed_routes = ['login', 'signup']
        if request.endpoint not in allowed_routes and 'username' not in session:
            return redirect(url_for('login'))
    
    @app.route('/login', methods=['GET', 'POST'])
    def login():
        # 登录逻辑
        pass
    
    @app.route('/signup', methods=['GET', 'POST'])
    def signup():
        # 注册逻辑
        pass
    
    @app.route('/')
    def index():
        return "Welcome, " + session['username']
    

    在这个例子中,require_login 函数使用了 @app.before_request 装饰器,所以它会在每个请求开始之前运行。这个函数检查用户是否已经登录(即 'username' 是否在 session 中)。如果用户未登录,并且他们正在尝试访问除 ‘login’ 和 ‘signup’ 以外的路由,那么他们将被重定向到登录页面。

    注意:这个例子假设你已经设置了 session,并且在用户登录时将他们的用户名添加到了 session 中。在实际的 Flask 应用中,你可能还需要使用 Flask 的 flask_login 扩展来更安全、更方便地处理用户登录。

  3. @app.after_request():这个装饰器用于注册在每次请求之后运行的函数,无论请求是否成功。这对于需要在处理请求之后执行某些操作(如关闭数据库连接、记录日志等)的情况非常有用。

    让我们来看一个使用 @app.after_request() 装饰器的例子。假设我们有一个 Flask 应用,我们想在每个请求结束后在服务器日志中记录一些信息,比如请求的状态码和处理请求所花费的时间。

    from flask import Flask, request
    import time
    
    app = Flask(__name__)
    
    @app.before_request
    def start_timer():
        request.start_time = time.time()
    
    @app.after_request
    def log_request(response):
        # 获取请求开始时间
        start_time = request.start_time
        # 计算请求花费的时间
        elapsed_time = time.time() - start_time
        # 获取请求的路径
        path = request.path
        # 获取响应的状态码
        status_code = response.status_code
        # 记录信息到服务器日志
        app.logger.info(f"Path: {path}, Status Code: {status_code}, Time: {elapsed_time}")
        return response
    
    @app.route('/')
    def index():
        return "Hello, World!"
    

    在这个例子中,start_timer 函数使用了 @app.before_request 装饰器,所以它会在每个请求开始之前运行。这个函数记录了请求开始的时间。

    log_request 函数使用了 @app.after_request 装饰器,所以它会在每个请求结束后运行。这个函数计算了处理请求所花费的时间(当前时间减去请求开始的时间),然后将请求的路径、响应的状态码和处理请求所花费的时间记录到服务器日志中。

    注意:这个例子假设你的 Flask 应用已经配置了日志记录。在实际的 Flask 应用中,你可能需要使用 Flask 的 app.logger 对象或其他日志库来记录日志。

  4. @app.teardown_request():这个装饰器用于注册在每次请求结束后运行的函数,无论请求是否成功。这对于需要在请求结束后执行某些清理操作的情况非常有用。

    看一个使用 @app.teardown_request() 装饰器的例子。假设我们有一个 Flask 应用,我们在每个请求开始时都会打开一个数据库连接,我们想在每个请求结束后关闭这个连接。

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:tmp/test.db'
    db = SQLAlchemy(app)
    
    @app.before_request
    def before_request():
        # 打开数据库连接
        db.session = db.create_scoped_session()
    
    @app.teardown_request
    def teardown_request(exception):
        # 关闭数据库连接
        db.session.remove()
    
    @app.route('/')
    def index():
        return "Hello, World!"
    

    在这个例子中,before_request 函数使用了 @app.before_request 装饰器,所以它会在每个请求开始之前运行。这个函数创建了一个新的数据库会话并将其存储在 db.session 中。

    teardown_request 函数使用了 @app.teardown_request 装饰器,所以它会在每个请求结束后运行,无论请求是否成功。这个函数关闭了数据库会话。

  5. @app.errorhandler():这个装饰器用于注册错误处理函数。你可以使用它来定义当特定的 HTTP 错误发生时应该如何响应。例如:

    @app.errorhandler(404)
    def page_not_found(error):
    return 'This page does not exist', 404
    

​ 在这个例子中,@app.errorhandler(404) 装饰器将 page_not_found 函数注册为处理 404 错误的函数。

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

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

相关文章

【C++初阶】C++基础(上)——C++关键字、命名空间、C++输入输出、缺省参数、函数重载

目录 1. C关键字 2. 命名空间 2.1 命名空间的定义 2.2 命名空间的使用 3. C输入&输出 4. 缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 5. 函数重载 5.1 函数重载概念 5.2 C支持函数重载的原理——名字修饰(name Mingling) 5.3 extern &…

【Nodejs】接口规范和业务分层

1.接口规范-RESTful架构 1.1 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编…

图像 检测 - FCOS: Fully Convolutional One-Stage Object Detection (ICCV 2019)

FCOS: Fully Convolutional One-Stage Object Detection - 全卷积一阶段目标检测(ICCV 2019) 摘要1. 引言2. 相关工作3. 我们的方法3.1 全卷积一阶目标检测器3.2 FCOS的FPN多级预测3.3 FCOS中心度 4. 实验4.1 消融研究4.1.1 FPN多级预测4.1.2 有无中心度…

HighTec 工程配置详解1

目录 HighTec 工程配置详解编译配置构建配置管理器编译属性编译步骤编译环境变量编译日志编译配置TriCore C CompilerTriCore C LinkerHighTec 工程配置详解 编译配置 构建配置管理器 管理器内,可以创建各种不同用途的配置项。例如用于生产工程的 ROM 配置,用于调试工程的…

神经网络的初始化方法

文章目录 1、随机初始化2、Xavier初始化3、He初始化4、权重预训练初始化5、零初始化 对于神经网络的训练过程中,合适的参数初始化方法有助于更好的处理梯度消失和梯度爆炸问题。通常有以下几种初始化方法: 1、随机初始化 随机初始化(Random…

Android调用摄像头拍照从相册中选择图片

以下内容摘自郭霖《第一行代码》第三版 activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-a…

Java BIO,NIO,AIO

一丶IO模型&Java IO# Unix为程序员提供了以下5种基本的io模型&#xff1a; blocking io&#xff1a; 阻塞iononblocking io&#xff1a; 非阻塞ioI/O multiplexing&#xff1a; io多路复用signal driven I/O&#xff1a;信号驱动ioasynchronous I/O&#xff1a;异步io 但…

理解跨平台技术

1、为什么需要跨平台技术 write once&#xff0c;run everywhere 开发一个APP运行在Android手机需要一套代码&#xff0c;运行在ios操作系统的手机又需要一套代码&#xff0c;为了使同一套代码能运行在不同的操作系统上&#xff0c;解决多端独立开发的问题&#xff0c;跨平台…

综合案例(面向对象)

使用面向对象思想完成数据读取和处理基于面向对象思想重新认知第三方库使用&#xff08;PyEcharts&#xff09; 数据分析案例 某公司&#xff0c;有2份数据文件&#xff0c;现需要对其进行分析处理&#xff0c;计算每日的销售额并以柱状图表的形式进行展示。 数据内容 综合案…

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景&#xff1a;因公司项目需求改用VMware Workstation Pro&#xff0c;已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今&#xff0c; 1:这里贴出拿出现的问题提示及解决方法的链接&#xff1a;解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

STM32CubeMX配置STM32G031多通道ADC + DMA采集(HAL库开发)

时钟配置HSI主频配置64M 勾选打开8个通道的ADC 使能连续转换模式 添加DMA DMA模式选择循环模式 使能DMA连续请求 采样时间配置160.5 转换次数为8 配置好8次转换的顺序 配置好串口&#xff0c;选择异步模式配置好需要的开发环境并获取代码 修改main.c 串口重定向 #include &…

基于因果关系知识库的因果事件图谱构建、文本预处理、因果事件抽取、事件融合等

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

软件外包开发的流程图工具

软件开发过程中需要画流程图&#xff0c;可以更清楚的表达软件业务流程&#xff0c;减少在开发过程中的业务理解偏差&#xff0c;因此在软件开发过程中流程图工具是必不可少的软件管理工具。今天和大家分享常见的一些软件流程图工具&#xff0c;每款工具都有其自身的特色&#…

uniapp 微信小程序:页面+组件的生命周期顺序

uniapp 微信小程序&#xff1a;页面组件的生命周期顺序 首页页面父组件子组件完整顺序参考资料 这个uniapp的微信小程序项目使用的是 VUE2 首页 首页只提供了一个跳转按钮。 <template><view><navigator url"/pages/myPage/myPage?namejerry" hov…

flask中的session介绍

flask中的session介绍 在Flask中&#xff0c;session是一个用于存储特定用户会话数据的字典对象。它在不同请求之间保存数据。它通过在客户端设置一个签名的cookie&#xff0c;将所有的会话数据存储在客户端。以下是如何在Flask应用中使用session的基本步骤&#xff1a; 首先…

Linux内核中的链表、红黑树和KFIFO

lLinux内核代码中广泛使用了链表、红黑树和KFIFO。 一、 链表 linux内核代码大量使用了链表这种数据结构。链表是在解决数组不能动态扩展这个缺陷而产生的一种数据结构。链表所包含的元素可以动态创建并插入和删除。链表的每个元素都是离散存放的&#xff0c;因此不需要占用连…

kafka消息监听

1&#xff0c;spring配置kafka网址 2&#xff0c;listener Component public class OrderMsgListener {KafkaListener(topics "order",groupId "order-service")public void listen(ConsumerRecord record){System.out.println("收到消息&#xf…

IPv6 over IPv4

IPv6 over IPv4隧道简介 IPv6 over IPv4隧道可实现IPv6网络孤岛之间通过IPv4网络互连。由于IPv4地址的枯竭和IPv6的先进性&#xff0c;IPv4过渡为IPv6势在必行。因为IPv6与IPv4的不兼容性&#xff0c;所以需要对原有的IPv4设备进行替换。但是如果贸然将IPv4设备大量替换所需成…

11.python设计模式【责任链模式】

内容&#xff1a;使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。角色&#xff1a; 抽象处理者&#xff08;Handler&#xff09;具体处理…

【用户体验分析报告】 按需加载组件,导致组件渲染卡顿,影响交互体验?组件拆包预加载方案来了!

首先&#xff0c;我们看一些针对《如何提升应用首屏加载体验》的文章&#xff0c;提到的必不可少的措施&#xff0c;便是减少首屏幕加载资源的大小&#xff0c;而减少资源大小必然会想到按需加载措施。本文提到的便是一个基于webpack 插件与 react 组件实现的一套研发高度自定义…