在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)  # 登录后记录用户登录IPreturn '登录成功!'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下面的一个自定义的属性usernamelogin_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的属性,也就是我们在上面赋值的usernamedef 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相关信息)。

Flask04——请求上下文和应用上下文相关推荐

  1. Flask中的请求上下文和应用上下文

    在Flask中处理请求时,应用会生成一个"请求上下文"对象.整个请求的处理过程,都会在这个上下文对象中进行.这保证了请求的处理过程不被干扰.处理请求的具体代码如下: def wsg ...

  2. Flask框架(flask中的请求上下文和应用上下文,以及请求钩子的使用,Flask-Script 扩展命令行)

    1.请求上下文与应用上下文 请求上下文(request context) request和session都属于请求上下文对象. 应用上下文(application context) current_a ...

  3. 进程上下文和中断上下文

    1.进程上下文 进程上下文实际上是进程执行活动全过程的静态描述.我们把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为上文,把正在执行的指令和数据在寄存器和堆栈中的内容称为正文,把待执行的指令和 ...

  4. Linux:上下文,进程上下文和中断上下文概念,上下文切换

    Linux:上下文,进程上下文和中断上下文概念,上下文切换 1. 上下文 context:(就是一个环境) 2. 进程上下文 2.1 进程上下文的三个部分:用户级上下文.寄存器上下文以及系统级上下文 ...

  5. HTTP请求报文和HTTP响应报文(转载)

    本文转载自HTTP请求报文和HTTP响应报文,感谢作者~ HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的.HTTP有两类报文:请求报文和响应报文. HTT ...

  6. linux 中断和进程 传递,Linux内核之进程上下文和中断上下文的区别

    进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触.看上去很懂但又说不清楚到底怎么回事.造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停 ...

  7. elasticsearch6.6文档翻译-查询语句-查询上下文和过滤上下文

    查询上下文和过滤上下文 {#query-filter-context} 查询子句的行为取决于它是在查询上下文中使用,还是在过滤上下文中使用: 查询上下文 一个查询子句在查询上下文中被使用时,能够解答这 ...

  8. 深度理解HTTP请求报文和HTTP响应报文

    HTTP请求报文和HTTP响应报文 HTTP协议简介 超文本传输协议(英文:Hyper Text Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议.设计HTTP ...

  9. Power BI(二十一)power pivot之筛选上下文和行上下文

    Power BI(二十一)power pivot之筛选上下文和行上下文 其实上下文概念并不深奥,但是对于习惯使用Excel计算函数的亲们来说在学习这块知识时感觉会比较别扭,这主要是因为在Excel中, ...

最新文章

  1. 模块化以及requirejs和seajs
  2. 提示You don't have permission to access /index.php on this server.
  3. 径向基函数插值(3)二维数据的插值
  4. c#使用PdfiumViewer展示、打印pdf文档
  5. Java中的NIO非阻塞编程
  6. 爱特php文件管理器2.8_查找「超级蜘蛛池开发者中心 抠:44564876易」安卓应用 - 豌豆荚...
  7. 查询(python 版)
  8. Wireshark和TcpDump抓包分析心得
  9. linux6.5修复引导,CentOS 6.5 修复grub引导
  10. linux ping 虚拟网卡_Linux下添加虚拟网卡,实现一块物理网卡绑定多个IP地址
  11. mysql字符类型_MySQL学习分享--字符类型
  12. 课程设计之学生选课管理系统
  13. 知识分享:C语言语法总结,初学者可收藏
  14. android epson wifi,epson投影仪无线投屏怎么连接手机、电脑
  15. 关于 Could not find artifact ...:pom:1.0-SNAPSHOT 的问题!
  16. 钛资本研究院:企业服务早期投资方法论
  17. JAVA字符串占位符使用
  18. 你还在盲目跟风学Python?不要盲目!某华大学教授有话要说
  19. shell脚本中等待上一条命令执行结束在执行下一条。
  20. Latex行距调整总结

热门文章

  1. 揭秘京东城市时空数据引擎—JUST如何助力交通流量预测
  2. 波长波数转换matlab,【求助】请教红外常用波数与波长之间的转换关系...
  3. 基础的拉普拉斯金字塔融合用于改善图像增强中易出现的过增强问题(一)
  4. 移动前端安全防护主流方案
  5. 交换机进行syslog服务器设置
  6. 什么是docx,pptx等的正确MIME类型?
  7. Android水果超市的登录界面,【水果识别】自助水果超市matlab源码含 GUI
  8. QTextEdit和QTextDocument(ZZ)
  9. IV-工具变量法:第一阶段系数符号确定时的小样本无偏估计
  10. 工作随记-Java利用企业微信群机器人定时发送消息