Flask04——请求上下文和应用上下文

Flask 上下文 request对象封装了HTTP请求的所有信息,并在请求处理过程中自动创建。session对象是一个跨请求持久的字典,用于存储用户会话信息。request和session都是Flask请求上下文的一部分,但在用途和存储方式上有所不同。在视图函数中,Flask会自动为你创建请求上下文,所以你可以直接使用request和session对象。但是,在视图函数之外(比如自定义的函数或类中),如果你需要访问这些对象,就需要手动地创建请求上下文。 阅读详情

在flask框架中,引入了上下文的概念,为了能够让大家真实的感受到上下文在flask框架中所起到的作用,所以下面我就用一个具体的需求实例来给大家进行说明,首先在我不使用上下文思路的情况下来解决这一需求,然后再改造成使用了上下文的方式,那么我们就可以更好的来对比前后的不同,从而感受到上下文的作用、原理、以及给我们带来的好处。
在实际的开发中,当用户登录之后,就会把用户登录时候的时间,IP地址这些数据记录到数据库里面此用户的名下,那么下面我们就来实际的模拟一下这过程。当然具体写入数据库的操作就不实际的写了,只是打印出来模拟写入数据库的操作即可,因为我们的现在要说的重点上下文的相关概念。以下就是不使用上下文的解决方案。

# 需要引入的包
from datetime import datetime
import time

# 不使用上下文的解决方案
@app.route('/login')
def login():
    username = request.args.get('username')
    passwd = request.args.get('passwd')
    if username == 'xiaoming' and passwd == '111111':  # 验证登录
        login_time(username)  # 登录后记录用户登录时间
        login_ip(username)  # 登录后记录用户登录IP
        return '登录成功!'
    else:
        return '用户名或密码不正确!'


# 记录用户登录时间,并写入数据库
def login_time(username):
    print('当前登录用户为{},登录时间为:{},已写入数据库了!'.format(username, datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
    # 获取到当前的获取当前时间的datetime类型,再格式化转换成年月日格式的时间


# 记录用户登录IP,并写入数据库
def login_ip(username):
    print('当前登录用户为{},登录ip为:{},已写入数据库了!'.format(username, request.__dict__['environ']['REMOTE_ADDR']))
    # __dict__ : 类的属性(包含一个字典,由类的数据属性组成)  从request请求对象中,获取到客户端IP地址

当然我们首先需要通过地址 http://127.0.0.1:8111/login?username=xiaoming&passwd=111111 来验证我们的代码。
在以上代码中,当我们验证了用户名和密码以后就调用了记录用户登录时间和用户登录IP的方法。将记录写入到了数据库里面的该用户的记录下面。我们看到,由于我们需要记录某一用户的登录时间和登录IP,所以我们不得不传递当前用户的信息(用户名)给login_time和login_ip函数中。如果我们有许多类似的函数调用,是不是每个都要传递参数呢?有没有更简化的操作呢?

这里就要提到我们的应用上下文中的g变量。g是一个全局临时变量。全局指的是同一次request请求,临时指的时,此次request请求一旦消失,g变量也随之消失,再一次request请求又会新生成一个g变量。

让我们通过应用上下文的g变量来改造上面的需求

# 需要引入g变量
from flask import Flask, request, g

# 使用g全局临时变量后
@app.route('/login')
def login():
    username = request.args.get('username')
    passwd = request.args.get('passwd')
    if username == 'xiaoming' and passwd == '111111':
        g.username = username  # 将username赋值给g全局临时变量g下面的一个自定义的属性username
        login_time()
        login_ip()
        return '登录成功!'
    else:
        return '用户名或密码不正确!'


def login_time():
    print('当前登录用户为{},登录时间为:{},已写入数据库了!'.format(g.username, datetime.now().strftime('%Y-%m-%d %H:%M:%S')))
    # 我们就可以从g全局临时变量上直接取到g.username的属性,也就是我们在上面赋值的username


def login_ip():
    print('当前登录用户为{},登录ip为:{},已写入数据库了!'.format(g.username, request.__dict__['environ']['REMOTE_ADDR']))

对比上下,大家看到有什么不同呢?我们这次在调用两个函数的时候没有传递username进去,而是直接将变量username赋值给了g下面我们自定义的一个属性g.username。而在两个函数login_time和login_ip内部,我们就直接通过g.username的形式就可以拿到上面传递过来的值。神不神奇?意不意外?这是怎么做到的呢?让我们来解释以下其中的原理。
首先我们在浏览器中通过地址发起了对login视图函数的请求。而在此视图函数内部,我们又调用了login_time和login_ip这两个函数,那么就意味着我们同在一次request请求当中,而我们上面说了再同一次request请求当中是可以共享全局临时变量g的。

所以flask框架就给我们提供了这一变量,由于g变量是供我们实例化的app应用(指的是app=Flask(name)存储变量、数据来用的,所以被叫做应用上下文。应用上下文一般是用来保存配置信息,数据库链接,应用信息等的。

那么再来说以下request,我们同样看到,我们浏览器当中实际请求的时login视图函数,但是我们却从login_ip当中去获取客户端ip地址,request.__dict__['environ']['REMOTE_ADDR'])),也就是我们从request对象中包含的字典当中,来取其中的各个属性。那么我们为什么可以这样做呢?这就是我们的请求上下文的概念,虽然login和login_ip是两个函数,但是由于我们在login视图函数当中调用了login_ip,所以他们都归属于同一个请求。在同一个请求的上下文当中,他们是拥有相同的request属性,所以我们可以从login_ip函数中取到此次请求的客户端IP地址。

所以request属于请求上下文,保存着客户端和服务器交互的数据。而我们上面提到的应用上下文g,主要是帮助request获取当前的应用,伴随着request而生,随request的消失而消失的。

关于请求上下文,还有session也属于请求上下文,根据我们之前所讲,session是用来保持不同请求之间的状态的,要在不同的请求之间传递用户信息,所以明显能够感觉到session就是为多请求而生的。我们可以在登录请求中写入用户信息到session中,然后我们就可以在用户中心的请求中使用session中的用户信息了。可以看出session就是用来保证多请求在同一会话管道中共享数据的,所以session也是请求上下文。

另外current_app也是flask提供的应用上下文,里面保存了当前app应用的相关信息,这里我们只来看一下怎么通过current_app获取我们的配置项。我们可以在配置文件setting.py中加入新的配置项:设置分页每页显示数据的个数PER_PAGE=10,我们就可以以下方式拿到这个配置项了。

# 引入current_app
from flask import Flask, request, g, current_app

@app.route('/app_data')
def app_data():
    print(current_app.config['PER_PAGE'])
    return 'app_data'

这就是我们讲的四个上下文:
请求上下文:request(记录http请求的相关内容)、session(记录请求会话中的信息)。
应用上下文:g(在同一次请求上下文中设置临时变量属性,供请求上下文使用)、curent_app(保存当前app相关信息)。

InTouch历史报警与操作记录高效查询控件V4.0实战指南(一键下载即用) 本文详细介绍了InTouch历史报警与操作记录高效查询控件V4.0的实战应用。该控件针对原生AlmDbViewCtrl控件的查询效率低下、功能单一等问题,提供了智能查询、可视化统计、视图定制和一键导出Excel等强大功能,旨在帮助工程师快速处理海量历史数据,大幅提升工控运维效率。 阅读详情

相关推荐

【实战案例】IBM V3500存储控制器故障诊断与更换全流程解析

本文详细解析了IBM Storwize V3500存储控制器发生故障后的完整处理流程。通过还原真实故障现场,介绍了如何利用服务助手精准定位缓存模块损坏的根源,并逐步指导完成控制器备件准备、核心部件移植更换、系统上线同步及全面功能验证的全过程,为存储运维人员提供了一份实用的实战指南。

weixin_29269441的博客 549

Flask框架中上下文(请求上下文和应用上下文)用法详解

Flask框架中上下文(请求上下文和应用上下文)用法详解

IT之一小佬的博客 7520

在运行opencv时出现的两个问题:AttributeError: module ‘cv2‘ has no attribute ‘gapi_wip_gst_GStreamerPipeline‘

解决了opencv的两个问题:由问题一引出 AttributeError: module 'cv2' has no attribute 'gapi_wip_gst_GStreamerPipeline' cv2.error:OpenCV(4.1.2)C:\projects\opencvpython\opencv\modules\highgui\src\window.cpp:717:error: (-2:Unspecified error) The function is not implemented...

hu_yinghui的博客 3278

flask进阶--请求上下文和应用上下文

1、Thread Local(本地线程) 从面向对象设计的角度看,对象是保存“状态”的地方。Python 也是如此,一个对象的状态都被保存在对象携带的一个特殊字典中。Thread Local 则是一种特殊的对象,它的“状态”对线程隔离 —— 也就是说每个线程对一个 Thread Local 对象的修改都不会影响其他线程。 (local.py) importthrea...

weixin_30246221的博客 382

解决用加速器以后,电脑无法连接网络的问题

相信很多朋友也遇到过,用加速器以后,电脑网络直接断了,或者访问外网时打不开的情况解决办法是。

qq_46368050的博客 1万+

基于Simulink雷达系统建模仿真(附源码)

此示例显示如何设置由发射器、带目标的信道和接收器组成的雷达系统仿真。一、系统架构该系统包括:雷达脉冲发生器,以 2% 占空比(导通时间 = 2 ms,周期 = 100 ms)输出功率为 1 mW 的啁啾声。RF发射器部分由滤波器和组成,使用RF模块集电路包络库模块实现。由于滤波器是线性器件,放大器是非线性器件,因此它们被分成两个独立的子系统。这种分离允许在每个子系统中使用不同的仿真频率集。这种分离还允许在更快的仿真速度和级联链中可用的级间负载效应损失之间进行权衡。

珞瑜的博客 4583

【python】flask执行上下文context,请求上下文和应用上下文原理解析

综上就是flask请求上下文和应用上下文原理分析和案例应用分享,请求上下文对象:保存了 Flask 程序运行过程中的一些信息[变量、函数、类与对象等信息]。应用程序上下文,用于存储flask应用实例对象中的变量,可以通过current_app.name打印当前app的名称,也可以在current_app中存储一些变量。感兴趣的朋友可以一键三连,flask持续更新中!!!

2401_89308151的博客 1869

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6290

Flask之请求上下文、应用上下文的概述

Flask中有两种上下文,请求上下文和应用上下文 一、请求上下文(request context) request和session都属于请求上下文对象。 1.request:封装了HTTP请求的内容,针对的是http请求。举例:user = request.args.get(‘user’),获取的是get请求的参数。 2.session:用来记录请求会话中的信息,针对的是用户信息。举例:s...

我愿做一个聆听者,以学习为伴! 975

CloudCompare 和 PCL:点云网格化分析与处理

点云网格化是将点云数据转化为规则网格的过程,其主要思想是将离散的点云投影到一个平面上,然后对该平面进行划分,形成一系列小区域。在点云网格化方面,PCL 提供了各种算法和工具,可以实现高效的点云网格化操作。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化算法参数,如搜索半径和最大三角形边长等,执行了网格化操作,最后将网格化结果保存到输出文件中。以上示例代码中,首先加载了输入的点云数据,然后通过设置合适的网格化参数,如分辨率等,执行了网格化操作,最后将网格化结果保存到输出文件中。

TechPulseZ的博客 1293

把财务与管理会计装进一张表:读懂 S/4HANA 的 ACDOCA

别慌,这反而是设计所需。只是大量历史上为汇总、加速而建的索引与汇总表被淘汰或改造,很多被兼容视图 compatibility views 替代,通过视图去 ACDOCA 或 ACDOCT 取数,从而保证老代码还能 SELECT 到数据,但失去写权限。它把原来分散在多张表里的信息整合到一起,例如总账、固定资产、物料账、盈利能力分析 CO-PA、成本控制等维度,发布过的资料多次强调这一点。其二,查询必须带上高选择性的条件,尤其是 RLDNR、RBUKRS、GJAHR 这三个维度,能大幅降低列存扫描的代价。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 956

解析 Flask 上下文机制:请求上下文、应用上下文

Flask框架通过请求上下文和应用上下文实现环境隔离机制。请求上下文(request/session)处理单个HTTP请求的专属数据,在请求开始和结束时自动创建销毁;应用上下文(current_app/g)管理应用级资源,支持非请求场景访问。二者依赖LocalStack实现线程安全隔离,保证多线程并发下的数据安全。这种机制使开发者无需显式传参即可全局访问环境数据,是Flask处理请求逻辑和扩展开发的核心基础。理解上下文机制对掌握Flask数据库会话、模板渲染等功能至关重要。

人非生而知之者 1580

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Pyton Flask基本环境搭建

开发平台: . OS Platform:       Ubuntu Description: Ubuntu 16.04.2 LTS Release: 16.04 Codename:  xenial     1. 虚拟环境构建(为什么需要使用虚拟环境?)           使用虚拟环境安装Flask,可以避免包的每个项目之间的程序扩展包混乱和版本的冲突,虚拟环境是Python解释器的

simon的专栏 822

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Flask应用上下文问题解析与解决方案:从错误日志到完美修复

数据库连接 (db.session配置信息 (其他全局对象(如缓存、任务队列等)HTTP 请求到达时(@app.route处理函数内)CLI 命令执行时(或自定义命令)后台线程异步任务(如 Celery)定时任务(如 APScheduler)测试代码Flask 应用上下文是访问db.session等对象的前提。在非请求上下文中(如线程、任务队列),必须手动管理上下文。使用或确保代码正确运行。推荐使用任务队列(如 Celery)处理长时间运行的任务。

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【flask框架】——异常处理、请求勾子、蓝图和上下文

目录1、异常处理2、请求勾子2、蓝图3、上下文(context) 1、异常处理 flask对 HTTP错误 进行了封装, 可以捕获http错误, 也可以主动抛出http错误 扩展: # 权限认证失败 # abort(401) # 禁止访问 # abort(403) # 请求方法错误 # abort(405) # 服务器内部错误 # abort(500) from flask import Flask, redirect, abort # 需求:捕获项目中的所有404异常信息,引导到一个统一的页面 #

user_san的博客 701

如何在Ubuntu 18.04上使用uWSGI和Nginx为Flask应用提供服务

在本指南中,您将在 Ubuntu 18.04 上使用 Flask 微框架构建一个 Python 应用程序。本文的重点将是如何设置 uWSGI 应用服务器,以及如何启动应用程序并配置 Nginx 作为前端反向代理。

rubys007的博客 1389

如何在 Ubuntu 18.04 上安装 Flask

Flask 是一个免费的开源微博客框架,旨在帮助开发人员构建安全,可扩展和可维护的 Web 应用程序。 Flask 基于Werkzeug 并使用 Jinja2 作为模板引擎。 与 Django 不同,默认情况下,Flask 不包括 ORM,表单验证或第三方库提供的任何其他功能。 Flask 构建时考虑了扩展,这些扩展是为 Flask 应用程序添加功能的 Python 包。 根据您的需要,可以使用...

人生代码 ---- 公众号 4517

flask笔记4:上下文与请求钩子

01上下文02请求钩子04 Flask-script扩展命令行

越开源越幸运 346

如何在 Ubuntu 18.04 上使用 Gunicorn 和 Nginx 提供 Flask 应用程序

在本指南中,您将在 Ubuntu 18.04 上使用 Flask 微框架构建一个 Python 应用程序。本文的大部分内容将介绍如何设置 Gunicorn 应用服务器,以及如何启动应用程序并配置 Nginx 作为前端反向代理。

rubys007的博客 2327

Flask学习之请求钩子、状态保持、上下文、flash消息闪现、重定向

Flask学习之请求钩子、cookie和session、Jinja2...请求钩子(类似于django的中间件)状态保持cookie设置和获取设置cookie获取cookie删除cookiesession的设置和获取利用系统方法创建一个secret_key设置session和跳转到获取session页session的过期时间 请求钩子(类似于django的中间件) before_first_re...

paul0926的博客 876

flask-profiler:统计flask应用接口请求数和耗时情况

一、背景 我们基于Flask开发了一些测试工具和应用,有一天老板问我,说这个有多少人用啊?请求数目大概是怎样的?我支支吾吾一脸懵逼...... 下来想了下,准备基于Python的装饰器和消息中间件(MQ)来做统计,即每个接口都加上这个装饰器,而这个装饰器的作用就是解析各个请求的相关信息,然后异步发送给一个消息中间件(MQ),最后写个消费者来处理这些消息并存储.... 虽然思路有了,但是感觉实现成本还是挺大的,幸运的是找到了一个库:flask-profiler,实践了下,这个基本可以满足我们的需求。

rs勿忘初心的博客 4564

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

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

君莫笑 276

Flask框架

Flask诞生于2010年,是Armin ronacher(人名)用 Python 语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。 Flask 本身相当于一个内核,其他几乎所有的功能都要用到扩展(邮件扩展Flask-Mail,用户认证Flask-Login,数据库Flask-SQLAlchemy),都需要用第三方的扩展来实现。比如可以用 Flask 扩展加入ORM、窗体验证工具,文件上传、身份验证等。Flask 没有默认使用的数据库,你可以选择 MySQL,也可以用 NoSQ

有用的话关个注,点个赞,收个藏🫶。 2084

flask之上下文

上下文:即语境,语意,在程序中可以理解为在代码执行到某一时刻时,根据之前代码所做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以完成的事情。 Flask中有两种上下文,请求上下文和应用上下文 Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。 1 请求上下文(request context) 思考:在视图函数中,如何取到当前请...

黑马程序员广州中心的专栏 345

如何在 Ubuntu 16.04 上使用 uWSGI 和 Nginx 提供 Flask 应用程序

在本指南中,我们将在 Ubuntu 16.04 上使用 Flask 微框架设置一个简单的 Python 应用程序。本文的大部分内容将介绍如何设置 uWSGI 应用服务器来启动应用程序,并使用 Nginx 作为前端反向代理。

rubys007的博客 1301
上一篇: Flask03——cookie和session
下一篇: Flask05——请求钩子和异常捕获
零寂前端
博客等级 码龄11年 59粉丝 16原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值