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

在flask框架中,引入了上下文的概念,为了能够让大家真实的感受到上下文在flask框架中所起到的作用,所以下面我就用一个具体的需求实例来给大家进行说明,首先在我不使用上下文思路的情况下来解决这一需求,然后再改造成使用了上下文的方式,那么我们就可以更好的来对比前后的不同,从而感受到上下文的作用、原理、以及给我们带来的好处。
在实际的开发中,当用户登录之后,就会把用户登录时候的时间,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变量。
在这里插入图片描述对比上下,大家看到有什么不同呢?我们这次在调用两个函数的时候没有传递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,我们就可以以下方式拿到这个配置项了。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值