2019独角兽企业重金招聘Python工程师标准>>>

根据前一篇应用上下文可知,请求上下文的作用域是发生在请求到来之后。

如有一个应用函数返回用户应该跳转到的URL。想象它总是会跳转到URL的next参数,或HTTP referrer或索引页:

from flask import request,url_for

def redirect_url():

return request.args.get('next') or request.referrer or url_for('index')

如你所见,它访问了请求对象。当你试图在纯python shell中运行这段代码时,你会看见这样的异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in redirect_url
  File "/home/wang/myproject/venv/local/lib/python2.7/site-packages/werkzeug/local.py", line 338, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/home/wang/myproject/venv/local/lib/python2.7/site-packages/werkzeug/local.py", line 297, in _get_current_object
    return self.__local()
  File "/home/wang/myproject/venv/local/lib/python2.7/site-packages/flask/globals.py", line 20, in _lookup_req_object
    raise RuntimeError('working outside of request context')
RuntimeError: working outside of request context
这有很大意义,因为我们当前并没有可以访问的请求。所以我们需要制造一个请求并且绑定到当前的上下文。我们可以使用test_request_context()和request_context()创建RequestContext实例。

其中,class flask.ctx.RequestContext(app,environ,request=None)

这 个类包含与请求相关的所有信息。该实例创建于请求的开始,然后将其压入_request_ctx_stack中,并且在结束时从栈中删除它。它将为 WSGI环境创建URL适配器和请求对象。然后,不能直接使用该类,而是用test_request_context()和 request_context()来创建。

request_context(environ)  (environ是WSGI环境)和test_request_context(*args,**kwargs)用法一样,可以使用with或push()和pop()

使用push()和pop()方法:

>>>app=Flask(__name__)

>>>ctx=app.test_request_context('/?next=http://example.com/')

>>>ctx.push()

从这点开始,你可以使用请求对象:

>>>redirect_url()

u'http://example.com/'

直到你调用pop:
>>>ctx.pop()

当使用with时:
>>>app=Flask(__name__)

>>>with app.test_request_context('/?next=http://example.com/')

因为请求上下文在内部作为一个栈来维护,所以你可以多次压栈出栈。这在实现内部重定向之类的东西时很方便。

对于request_context()一样。

请求上下文内部工作如同一个栈。栈顶是当前活动的请求。push()把上下文添加到栈顶。pop()把它移出。在出栈时,应用teardown_request()函数也会被执行。

回调和错误:

  1. 在每个请求之前,执行 before_request() 上绑定的函数。 如果这些函数中的某个返回了一个响应,其它的函数将不再被调用。任何情况下,无论如何这个返回值都会替换视图的返回值。

  2. 如果 before_request() 上绑定的函数没有返回一个响应, 常规的请求处理将会生效,匹配的视图函数有机会返回一个响应。

  3. 视图的返回值之后会被转换成一个实际的响应对象,并交给after_request() 上绑定的函数适当地替换或修改它。

  4. 在请求的最后,会执行 teardown_request() 上绑定的函数。这总会发生,即使在一个未处理的异常抛出后或是没有请求前处理器执行过 (例如在测试环境中你有时会想不执行请求前回调)

销毁和回调:

销毁回调是是特殊的回调,因为它们在不同的点上执行。严格地说,它们不依赖实际的请求处理,因为它们限定在 RequestContext 对象的生命周期。 当请求上下文出栈时, teardown_request() 上绑定的函数会被调用。

留意代理

Flask 中提供的一些对象是其它对象的代理。背后的原因是,这些代理在线程间共享, 并且它们在必要的情景中被调度到限定在一个线程中的实际的对象。

大多数时间你不需要关心它,但是在一些例外情况中,知道一个对象实际上是代理是有益的:

  • 代理对象不会伪造它们继承的类型,所以如果你想运行真正的实例检查,你需要在被代理的实例上这么做(见下面的 _get_current_object )。

  • 如果对象引用是重要的(例如发送 信号

如果你需要访问潜在的被代理的对象,你可以使用_get_current_object() 方法:

app = current_app._get_current_object() my_signal.send(app)

错误时的上下文保护

无论错误出现与否,在请求的最后,请求上下文会出栈,并且相关的所有数据会被销毁。在开发中,当你想在异常发生时,长期地获取周围的信息,这会成为麻烦。 在 Flask 0.6 和更早版本中的调试模式,如果发生异常,请求上下文不会被弹出栈, 这样交互式调试器才能提供给你重要信息。

从 Flask 0.7 开始,我们设定 PRESERVE_CONTEXT_ON_EXCEPTION 配置变量来更好地控制该行为。这个值默认与 DEBUG 的设置相关。当应用工作在调试模式下时,上下文会被保护,而生产模式下相反。

不要在生产模式强制激活 PRESERVE_CONTEXT_ON_EXCEPTION ,因为它会导致在异常时应用的内存泄露。不过,它在开发时获取开发模式下相同的错误行为来试图调试一个只有生产设置下才发生的错误时很有用。

在shell中使用上下文可参考:http://docs.jinkan.org/docs/flask/shell.html#shell

请求上下文:http://docs.jinkan.org/docs/flask/reqcontext.html

转载于:https://my.oschina.net/935572630/blog/372312

flask中的请求上下文相关推荐

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

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

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

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

  3. Web框架——Flask系列之请求上下文与应用上下文请求钩子Flask-Script扩展命令行(十七)

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

  4. Flask 中的上下文管理和请求钩子

    Flask 中的上下文管理和请求钩子 在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象 ...

  5. flask 核心 之 应用上下文 及 请求上下文

    Werkzeugs 是 Flask 的底层WSGI库. 什么是WSGI? 一段简单的app: def dispath_request(self, request):return Response('H ...

  6. 深入理解Flask中的上下文

    https://blog.csdn.net/barrysj/article/details/51519254 1.AppContext类即是应用上下文,可以看到里面只保存了几个变量,其中比较重要的有: ...

  7. python Flask 10 Flask请求上下文管理werkzeug

    什么是上下文    上下文相当于一个容器,保存了 Flask 程序运行过程中的一些信息. Flask 中有两种上下文,请求上下文(request 和 session )和应用上下文(current_a ...

  8. Flask中的上下文

    1. 分为请求上下文和应用上下文 应用上下文和请求上下文都是存放到一个LocalStack的栈中 应用app相关的操作就必须要用到应用上下文 请求相关的操作就必须用到请求上下文 2.请求上下文中还包括 ...

  9. flask中的request

    1.request是什么? 简单来说,它就是flask的封装的一个对象,这个对象包含着前端请求所带的所有信息.既然说它是一个对象,那么它肯定是有一些熟悉,和方法的,下面就来介绍下request里的熟悉 ...

最新文章

  1. [NOIP2015]子串
  2. 结构体成员赋值-标记化结构体初始化语法-结构体成员前面加小数点
  3. weblogic部署连接池
  4. 妈的我好像发现是哪出问题了
  5. base cap 分布式_干货分享:基于本地消息表的分布式事务解决方案总结
  6. cup first world_LOONCUP – The world's first SMART menstrual cup.
  7. qdialog 只有点击才能获得焦点_张怡筠:怎么做,孩子才能真正爱上学习?
  8. JWT(JSON Web Token) 多网站的单点登录,放弃session 转载https://www.cnblogs.com/lexiaofei/p/7409846.html...
  9. Java练习 SDUT-2561_九九乘法表
  10. 【优化分类】基于matlab麻雀算法优化核极限学习机KELM分类【含Matlab源码 1791期】
  11. 话筒在multisim怎么找_基于Multisim软件的调频无线话筒仿真
  12. oracle中锁表是什么,oracle锁表查询和解锁方法是什么,oracle锁表和解锁
  13. E45: 'readonly' option is set (add ! to override)
  14. 移动应用的全新方式:超级app+轻应用
  15. 暖一壶秋色,与你共清欢
  16. 秘密secret的安全性以及解决哪些痛点
  17. STM32驱动陀螺仪MPU6050的应用实例
  18. MySQL中复制表/结构的写法
  19. 探索者TSSD打印比例及绘图比例理解
  20. 网站、网页的自身优化--(如何让网站被搜索引擎搜索到)

热门文章

  1. Android RxJava(一) create操作符的用法和源码分析
  2. HTML5八大特性助力移动WebApp开发
  3. Android图片编码机制深度解析(Bitmap,Skia,libJpeg)
  4. jquery输入框按下回车提交表单
  5. HTML 超级链接详细讲解
  6. SQL Server 中的case when then else 中的结果类型
  7. Asp.net 2.0生命周期
  8. 50. 第一个只出现一次的字符
  9. pythonclass全局变量_Python的变量(全局变量、局部变量、类变量和实例变量)
  10. Vue之动态组件(二)