首页 > 其他分享 >flask上下文、g变量、current_app

flask上下文、g变量、current_app

时间:2023-10-04 12:22:07浏览次数:37  
标签:username 请求 flask app current 上下文

在flask中的上下文分为两种 :

请求上下文 (request context)

也就是和请求相关的上下文,记录一些请求相关的数据。

包含:

1、request请求对象

2、session会话

应用上下文 (app context)

记录一些和flask的应用(app=Flask(name))的上下文数据,

主要包含:

**1、current_app **

在项目其它py文件要使用app时就可以通过current_app来获取(减少循环导入的问题 )

使用方法:

from flask import current_app 

这个变量会返回当前的Flask对象
在项目其它文件要使用app时就可以通过current_app来获取(有助于:减少循环导入的问题 )

**2、g变量 **

使用方法:

from flask import g

这个玩意时flask提供给开发者用于存储数据的一个容器,

**特点:**
     **每次请求g对象中的数据都会被重置。**

**使用场景:**
     在视图函数和请求钩子函数之间传递数据。

开发时应用场景和案例

在视图函数中,所有代码本身就是处于应用上下文和请求上下文的。

如果我们在视图函数外使用时,就会报错:RuntimeError: Working outside of application context.

视图函数外使用应用上下文

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

视图函数外使用请求上下文:(几乎不用....了解即可)

# 同样的,请求上下文也是
# request.args   # RuntimeError: Working outside of request context.
environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'itcast server', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'}  # 模拟解析客户端请求之后的wsgi字典数据
with app.request_context(environ):
    print(request.method)

g变量的使用案例

"""
需求:
  每次请求前校验用户是否登录。(使用请求钩子)
  然后保存用户登录的id,方便调用。(使用g变量存储)
"""

from flask import current_app, g, request, session

# 不管是请求上下文还是应用上下文,他们的使用范围都只能在视图函数内使用!
# 生命周期:请求开始, 返回响应


from flask import Flask

app = Flask(__name__)
app.secret_key="asdadsadjei6546545"

# 注册请求钩子,
@app.before_request
def process_req():
    # 伪代码:请求前先校验是否有权限,如果有保存到g对象中
    # if xxxx:
    # g.username = "小明"
    # else:
    # abort(401)
    session_get = session.get("username")
    if session_get:
        # 将用户信息保存到g变量中
        g.username = session_get


@app.route('/index')
def demo1():
    # 视图函数中可以使用g变量读取出之前存储的值。
    username = g.get("username")
    if username:
        return "欢迎你:%s" % username
    else:
        return "重定向到登录页面!"


@app.route('/login')
def login():
    session["username"] = "小米"
    return "登录成功!"


if __name__ == '__main__':
    app.run(debug=True)

# 测试:
# 先不访问/login,然后直接访问/index,会出现”重定向到登录页面“提示
# 访问/login,然后再访问/index,出现”欢迎你: 小米“

标签:username,请求,flask,app,current,上下文
From: https://www.cnblogs.com/juelian/p/17742126.html

相关文章

  • Qemu源码分析(11)—Apple的学习笔记
    一,前言昨天了解了qemu中虚拟开发板的内存创建,接着再了解下中断创建和使用。二,分析昨天看了flash初始化,后面的我理解应该一样,接着发现sram初始化后,本来以为和flash是一样的,结果多了如下一句,通过注释也很好理解就是把1个bit展开为了1个byte,这样1M的sram变成了32M空间。//Bitbandthe......
  • 解决警告UserWarning: Glyph 38388 (\N{CJK UNIFIED IDEOGRAPH-95F4}) missing from
    这个警告是由于在绘图时使用了当前字体不支持的字符,通常出现在使用非英文字符(比如中文、日文等)时。为了解决这个问题,你可以尝试以下几种方法:方法一:选择支持中文的字体在绘图之前,指定一个支持中文的字体。例如,可以使用matplotlib.rcParams来指定字体,示例如下:importmatplotlib.pyplo......
  • uniapp高度相关计算
    获取屏幕高度uni.getSystemInfo()获取状态栏高度uni.getSystemInfo()高度计算rpx转化onLoad(){ uni.getSystemInfo({ success:function(res){ console.log(res.screenHeight);//屏幕高度注意这里获得的高度宽度都是px需要转换rpx ......
  • 什么是 Data-Centric Applications 架构
    SAP的经典应用程序(ClassicApplications)主要是面向事务处理的,这种架构在处理大量数据和复杂的分析任务时常会遇到性能瓶颈。为了解决这个问题,SAP引入了一种新的架构范式,即基于SAPHANADatabase的数据中心应用程序(Data-CentricApplications)。这种新的开发范式以数据为中心,能......
  • SAP S/4HANA 的 Data-Centric Applications 编程范式
    SAP数据中心应用开发范式是一种现代化的方法,旨在利用SAPHANA数据库的强大性能和功能来构建灵活、高效、实时的企业应用程序。这种方法与传统的SAP应用程序开发方式,如ClassicApplications,有着显著的不同。在这篇文章中,我将详细介绍SAP数据中心应用开发范式,包括其核心概念......
  • Qemu源码分析(10)—Apple的学习笔记
    一,前言Qemu的虚化主要包括cpu虚化,内存虚化,io虚化。而且3类虚化都包括了全虚化,半虚化和硬件虚化,这些也是网上看到的,大概了解了下。而我本节看qemu源码主要分析内存虚化,至于内存应该是硬件虚化,也就是多用了也EPT扩展页表,这是内核kvm中的代码不是qemu的代码了,不是我现在关注的内容。二......
  • vue 数据data-uniapp
    data属性data必须声明为返回一个初始数据对象的函数(注意函数内返回的数据对象不要直接引用函数外的对象);否则页面关闭时,数据不会自动销毁,再次打开该页面时,会显示上次数据。 //正确用法,使用函数返回对象 data(){ return{ title:'Hello' } } //错误写法,会导致再次......
  • jdk8中的ConcurrentHashMap原理和源码解读
    HashMap本身是线程不安全的,所以jdk提供了ConcurrentHashMap,这一篇来看下jdk8中的实现一、基本原理在jdk7中采用了Segment分段锁的思想来实现,在jdk8中不再采用分段锁的思想,jdk8中的ConcurrentHashMap和HashMap一样,都只有一层Entry数组来实现,那么它是怎么保证线程安全呢,我们通......
  • jdk7中的ConcurrentHashMap原理和源码解读
    HashMap是线程不安全的,所以jdk提供了ConcurrentHashMap这个线程安全的map集合实现,这一篇文章来分析下jdk7中ConcurrentHashMap的实现原理一、分段锁Segmentjdk7中ConcurrentHashMap的实现使用了分段锁的思想。先来思考下Hashtable是一个线程安全的map,但为什么它的效率不高......
  • 《DjangoApp开发》第二集,创建项目骨架、主菜单页面及跳转
    2023年10月3日这节课做的事情创建项目目录对项目进行全局时间、配置创建项目骨架,配置一堆文件写主页面切换页面项目结构。当我们发现代码很长的时候就分成多个子目录菜单界面对战界面玩家玩家的技能玩家的每一个技能玩家的移动背景时间设置界......