flask中的应用上下文

news2024/11/24 5:39:30

在这里插入图片描述

flask中的应用上下文

Flask应用上下文主要包含两个对象:current_appg。这两个对象在处理请求期间都是全局可访问的,但在每个请求结束时都会被重置。

  1. current_app:这是当前激活的Flask应用的实例。在大多数情况下,你可以将其视为应用的全局实例。然而,当你在处理多个应用(如在测试或大型应用中)时,current_app将始终指向处理当前请求的应用。

    以下是一个示例,展示了如何在视图函数中使用current_app

    from flask import Flask, current_app
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        print(current_app.name)  # Prints the name of the application.
        return 'Hello, World!'
    

    在上述代码中,我们打印了current_app.name,这是当前应用的名称。需要注意的是,current_app只能在有应用上下文的情况下访问,也就是说,如果你试图在视图函数之外访问current_app,Flask将会抛出一个错误。

  2. g:这是一个全局的请求级别的对象,你可以用它来在请求期间存储和共享数据。g对象在每个请求开始时被创建,并在每个请求结束时被销毁。

    以下是一个示例,展示了如何在视图函数中使用g

    from flask import Flask, g
    
    app = Flask(__name__)
    
    @app.before_request
    def load_data():
        g.data = 'Hello, World!'
    
    @app.route('/')
    def index():
        return g.data
    

    在上述代码中,我们使用app.before_request装饰器注册了一个函数,这个函数会在每个请求处理之前被调用。在这个函数中,我们将一些数据存储在g对象中,然后在视图函数中访问这些数据。需要注意的是,因为g对象在每个请求结束时被销毁,所以存储在其中的数据只在当前的请求中有效。

另外,如果你需要在请求外部(例如在请求未激活的情况下,或者在请求处理函数之外)访问current_appg,你需要使用应用上下文管理器来手动创建和激活应用上下文,例如:

with app.app_context():
    print(current_app.name)

在上述代码中,我们使用app.app_context()上下文管理器创建了一个应用上下文,并在其内部访问current_app。这允许我们在请求未激活的情况下访问应用上下文,一旦with语句结束,应用上下文将被销毁。

补充

在Flask中,@app.before_request修饰的函数并不在请求之外,而是在每个请求被处理之前执行的。也就是说,当一个请求被接收并开始处理,但在任何路由函数被调用之前,所有的@app.before_request修饰的函数都会被执行。

这样的设计使得@app.before_request修饰的函数可以用来执行一些通用的预处理任务,例如设置数据库连接、加载用户信息、检查用户的认证状态等。因为这些函数是在请求被处理的过程中执行的,所以它们可以访问并修改Flask的上下文变量,例如grequest

在上面例子中,load_data函数是在请求开始处理,但在路由函数被调用之前执行的。在这个函数中,你可以访问并修改g对象。然后在后续的路由函数中,你可以访问到在load_data函数中设置的g.data

总的来说,虽然@app.before_request修饰的函数不在任何特定的路由函数之内,但它们仍然是在请求被处理的过程中执行的,因此它们可以访问并修改Flask的上下文变量。

with app.app_context()

这是Flask提供的一种机制,使得能够在请求上下文(request context)或应用上下文(application context)尚未创建或者已经被销毁的情况下,手动创建并激活上下文。

通常情况下,当Flask接收到一个请求时,它会自动创建一个请求上下文和一个应用上下文,并在这两个上下文中提供如requestsessioncurrent_appg等对象。然后在处理完这个请求(也就是在路由函数返回后)时,Flask会自动销毁这两个上下文。

然而,有时候可能需要在请求未激活的情况下访问上下文变量。例如,在处理命令行脚本或者执行单元测试时,可能没有请求被接收,此时如果你如果访问current_app或者g,Flask会抛出一个错误,因为没有应用上下文。

为了解决这个问题,Flask提供了应用上下文管理器app.app_context(),我们可以使用它来手动创建并激活一个应用上下文。在这个上下文中,可以正常地访问current_appg等对象。例如:

with app.app_context():
    print(current_app.name)

在上述代码中,app.app_context()创建了一个应用上下文,并在其内部访问了current_app对象。这使得我们可以在请求未激活的情况下访问应用上下文。一旦with语句结束,应用上下文将被销毁,current_appg等对象将无法访问。

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

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

相关文章

MySQL数据库数据类型

MySQL数据库数据类型分类 在MySQL数据库中,MySQL数据类型分有四大类:数值类型、文本/二进制类型、时间日期和String类型。以下是这四大类的具体类型: 数值类型 数值类型的范围和字节大小: tinyint类型 tinyint类型只有一个字节…

【雕爷学编程】Arduino动手做(180)---Seeeduino Lotus开发板

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

BGP汇总和破解水平分割

一,BGP的宣告问题 在BGP协议中每台运行BGP的设备上,宣告本地直连路由在BGP协议中运行BGP协议的设备来宣告,通过IGP学习到的,未运行BGP协议设备产生的路由; 在BGP协议中宣告本地路由表中路由条目时,将携带本…

葡萄叶病害数据集

1.数据集 分成训练集和测试集 训练集有四个文件夹 第一个文件夹为 Grape Black Measles(葡萄黑麻疹)病害(3783张) Grape Black rot葡萄黑腐病病害数据集(3596张) Grape Healthy 健康葡萄叶(25…

【【胎教级51单片机智能小车设计】】

胎教级51单片机智能小车设计 从现在开始开一个新坑 称为创意工坊 主要更新一些有意思的设计 第一次手把手更新51单片机智能小车 胎教级教学人人都会 单片机实现的功能是通过蓝牙APP 控制小车前后左右移动 先讲明白这个小车 后续再在这个小车上更新其他的设计 成品图 第一步…

《Java-SE-第二十六章》之线程池

前言 在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!” 博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限&…

pytorch基础实践1

数据预处理的最终目的是将我们正在处理的任何数据转换成能够感知我们神经网络的张量 基本概念 CNN的输入tensor 一般CNN的输入是一个4阶张量,分别用一个字母代表每个axis上的长度,那么它的shape为: [B,C,H,W] 其中 H 和 W 分别代表输入的单…

北邮22信通:第五章 邻接表图的广度遍历和深度遍历

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏: 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 一.总纲 二.构造函数 2.1构造函数讲解 2.2构造函数的书写 书…

echars力引导关系图

效果图 力引导关系图 力引导布局是模拟弹簧电荷模型在每两个节点之间添加一个斥力,每条边的两个节点之间添加一个引力,每次迭代节点会在各个斥力和引力的作用下移动位置,多次迭代后节点会静止在一个受力平衡的位置,达到整个模型…

Java项目-苍穹外卖-Day01

文章目录 博客介绍软件开发流程项目介绍产品原型技术选型 博客介绍 从头开始做黑马的苍穹外卖项目 每天记录一下新学的知识点以及对应的开发进度 然后一些在项目中遇到的问题会重点标注 本篇主要是后端的,前端会一笔带过 软件开发流程 流程介绍需求分析需求规格说…

使用pg_prewarm缓存PostgreSQL数据库表

pg_prewarm pg_prewarm 直接利用系统缓存的代码,对操作系统发出异步prefetch请求,在应用中,尤其在OLAP的情况下,对于大表的分析等等是非常耗费查询的时间的,而即使我们使用select table的方式,这张表也并不可能将所有…

Eureka 学习笔记2:EurekaClient

版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口&#xff0c;拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能&#xff1a; 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…

【LeetCode】141. 环形链表 进阶题142. 环形链表 II

141. 环形链表 这道题还是用经典的快慢指针法来做。每次让快的指针走两步&#xff0c;慢的走一步。如果有环&#xff0c;则绝对会在环内的某一节点相遇。思想跟物理知识有点关系&#xff0c;如果有环&#xff0c;则在相对运动过程中&#xff0c;可以相当于慢指针静止&#xff0…

STM32入门——外部中断

中断系统概述 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前正在运行的程序&#xff0c;转而去处理中断程序&#xff0c;处理完成后又返回原来被暂停的位置继续运行中断优先级&#xff…

Java集合数组相互转换

1.集合转换成数组 &#xff08;1&#xff09;集合a通过toArray()方法进行转换为数组&#xff0c;可以转换成为指定类型的数组&#xff0c;但是这些类型都必须是object类型的子类&#xff0c;基本类型不可以。 必要时我们使用强制类型转换&#xff0c;转成我们需要的类型。 Li…

【网络编程】poll

主旨思想 用一个结构体记录文件描述符集合&#xff0c;并记录用户态状态和内核态状态 函数说明 概览 #include <poll.h> struct pollfd { int fd; /* 委托内核检测的文件描述符 */ short events; /* 委托内核检测文件描述符的什么事件 */ short revents; /* 文件描述…

MySQL 远程操作mysql

可以让别人在他们的电脑上操作我电脑上的数据库 create user admin identified with mysql_native_password by admin; //设置账号密码都为admingrant all on *.* to admin; //给admin账号授权 授权完成

​五、驱动 - ​音频系统硬件电路

文章目录 1. 音频系统硬件电路结构2. 蓝牙音频2.1 音乐播放2.2 VoIP通话2.3 4G通话3. 其他3.1 什么是S/PDIF1. 音频系统硬件电路结构 录音放音设备:mic、speaker、耳机、听筒这些带有录音放音功能的设备(因为录放设备可能是模拟设备也可能是数字设备,所以接口可能是模拟接口…

IDEA中怎么使用git下载项目到本地,通过URL克隆项目(gitee\github)

点击 新建>来自版本控制的项目 点击后会弹出这样一个窗口 通过URL拉取项目代码 打开你要下载的项目仓库 克隆>复制 gitee github也是一样的 返回IDEA 将刚刚复制的URL粘贴进去选择合适的位置点击克隆 下载完成

JavaEE初阶之网络初识

一、网络发展史 1.1独立模式 独立模式:计算机之间相互独立; 1.2网络互连 随着时代的发展,越来越需要计算机之间互相通信,共享软件和数据,即以多个计算机协同工作来完成业务,就有了网络互连。网络互连:将多台计算机连接在一起,完成数据共享。 数据共享本质是网络数据…