2.5.1、程序和请求上下文

Flask 从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的 HTTP 请求。

要想让视图函数能够访问请求对象,一个显而易见的方式是将其作为参数传入视图函数,不过这会导致程序中的每个视图函数都增加一个参数。

除了访问请求对象,如果视图函数在处理请求时还要访问其他对象,情况会变得更糟。

为了避免大量可有可无的参数把视图函数弄得一团糟,Flask 使用上下文临时把某些对象变为全局可访问。有了上下文,就可以写出下面的视图函数:

from flask import request

@app.route(‘/‘)

def index():

user_agent = request.headers.get(‘User-Agent‘)

return ‘<p>Your browser is %s</p>‘ % user_agent

Your b rowser is use r_agent app. rou e user def use r(name): 0/0 name http://127.0.0.l:sooo/ -"hi-1-: GET ? ‘00 0K HTTP/I O Date: ‘Wed, 29 Mar 2017 GMT‘ Server: "We.-kzeug/O.12.1 Python/2.7. 5‘ - 10.332 KB) User—Agent: "Mozilla/5.O (XII; Linux x86 _ 64; if retu rn name 52.0) Gecko/20100101 Firefox/S2.O‘ maln app. run(debug-T rue) ccept: 9, Accept—Encoding: "gzip, deflate‘ Connection: "keep-alive Cache—Control: "max-age—O " height="450" width="1097">

注意在这个视图函数中我们如何把 request 当作全局变量使用。事实上,request 不可能是

全局变量。试想,在多线程服务器中,多个线程同时处理不同客户端发送的不同请求时,

每个线程看到的 request 对象必然不同。Falsk 使用上下文让特定的变量在一个线程中全局

可访问,与此同时却不会干扰其他线程。

注:线程是可单独管理的最小指令集。进程经常使用多个活动线程,有时还会共

享内存或文件句柄等资源。多线程 Web 服务器会创建一个线程池,再从线

程池中选择一个线程用于处理接收到的请求。

在 Flask 中有两种上下文:程序上下文和请求上下文。表 2-1 列出了这两种上下文提供的

变量。

表2-1 Flask上下文全局变量

Flask 在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。程

序上下文被推送后,就可以在线程中使用 current_app 和 g 变量。类似地,请求上下文被

推送后,就可以使用 request 和 session 变量。如果使用这些变量时我们没有激活程序上

下文或请求上下文,就会导致错误。如果你不知道为什么这 4 个上下文变量如此有用,先

别担心,后面的章节会详细说明。

下面这个 Python shell 会话演示了程序上下文的使用方法:

[[email protected] test]$ source venv/bin/activate

(venv)[[email protected] test]$ python

Python 2.7.5 (default, Nov  6 2016, 00:28:07)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> from hello import app

>>> from flask import current_app

>>> current_app.name

Traceback (most recent call last):

...

RuntimeError: working outside of application context

>>> app_ctx = app.app_context()

>>> app_ctx.push()

>>> current_app

<Flask ‘hello‘>

>>> app_ctx.pop()

>>>

在这个例子中,没激活程序上下文之前就调用 current_app.name 会导致错误,但推送完上下文之后就可以调用了。注意,在程序实例上调用 app.app_context() 可获得一个程序上

下文。

时间: 2024-07-29 03:40:27

2.5.1、程序和请求上下文的相关文章

JSP内置对象——九大内置对象简介与四种作用域范围以及Web程序的请求和响应模式

最近在学习JSP相关基础知识,我们都知道JSP当中存在一组不使用new关键字就可以在脚本和表达式中使用的对象,在Web开发中经常使用.为了能更好的理解这些对象,在此对JSP内置对象作一些归纳. 目录: JSP内置对象——九大内置对象简介与四种作用域范围以及Web程序的请求和响应模式 JSP内置对象——out(待更新) JSP内置对象——request/response(待更新) JSP内置对象——session(待更新) JSP内置对象——application(待更新) JSP内置对象——其他

HttpContext请求上下文对象

一.HttpContext概述 HttpContext基于HttpApplication的处理管道,由于HttpContext对象贯穿整个处理过程,所以,可以从HttpApplication处理管道的前端将状态数据传递到管道的后端,完成状态的传递任务. HttpContext的生命周期从服务器接收的HTTP请求开始到反应发送回客户端结束. 在WebForm或类库(包括MVC)项目中,通过Current静态属性,就能够获得HttpContext的对象. HttpContext context =

flask基础之AppContext应用上下文和RequestContext请求上下文(六)

前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以单独存在的,但是请求上下文对象只有在收到请求后才会被创建.请求处理和应用上下文和请求上下文的关系是: 接收请求-->创建请求上下文-->请求上下文入栈-->创建该请求的应用上下文-->应用上下文入栈-->处理逻辑-->请求上下文出栈-->应用上下文出栈 系列文章 fl

微信小程序 网络请求之re.request 和那些坑

微信小程序有四种网络请求类型,下面只详细介绍普通HTTPS请求(wx.request) 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 首先,先确认是否设置了合法域名,或者在开发环境下不校验合法域名.关于设置合法域名请看→微信小程序 网络请求之设置合法域名   以下是wx.request的详细说明,截图于微信小程序开发文档 在微信index.js 发起一个普

微信小程序数据请求方法wx.request小测试

微信小程序数据请求方法 wx.request wxml文件: <view> <textarea value="{{textdata}}"/> </view> <button bindtap="RequestData" value="Button">Button</button> 主要是一个按钮,点击后将请求的数据写入到textarea中 js文件: Page({ data:{ textd

解决WCF“这可能是由于服务终结点绑定未使用 HTTP 协议造成的,这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致”异常

最近对系统的架构进行优化,用WinForm模拟客户端调用WCF,在WCF起一个Bus,把接收到的消息推送到各个Sub端. 本来很简单的调用关系,结果把WCF服务部署到IIS后,一直报"接收对 http://lenovo-y460:8099/Service.svc 的 HTTP 响应时发生错误.这可能是由于服务终结点绑定未使用 HTTP 协议造成的.这还可能是由于服务器中止了 HTTP 请求上下文(可能由于服务关闭)所致.有关详细信息,请参见服务器日志."异常,效果如下图所示: 出异常了

微信应用号小程序发起请求wx.request(OBJECT)

微信应用号小程序发起请求wx.request(OBJECT) wx.request(OBJECT) ? wx.request发起的是https请求.一个微信小程序,同时只能有5个网络请求连接. OBJECT参数说明: 参数名 类型 必填 说明 url String 是 开发者服务器接口地址 data Object.String 否 请求的参数 header Object 否 设置请求的header , header中不能设置Referer method String 否 默认为GET,有效值:O

IOC容器特性注入第七篇:请求上下文作用域

Ninject的对象作用域: Transient .InTransientScope() 每次调用创建新实例. Singleton .InSingletonScope() 单例,仅创建一个实例. Thread .InThreadScope() 每一个线程创建一个实例. Request .InRequestScope() 每当Web请求发起时创建一个实例,结束请求时释放实例 由于我们使用的web开发,所以一般都是InReuqestScope()的作用域,Kooboo对Ninject的作用域没有用,

【Nginx】请求上下文

上下文与全异步web服务器的关系 请求上下文指在一个请求的处理过程中,把一些关键的信息保存下来的类似struct这样的结构体.每个http模块都可以有自己的上下文结构体,一般都是在刚开始处理请求时在内存池上分配它,之后当经由epoll.http框架再次调用到http模块的处理方法时,这个http模块可以由请求上下文结构体中获取信息.请求结束时就会销毁该请求的内存池,自然也就销毁了上下文结构体. Nginx是全异步处理的web服务器,http模块可能会多次反复处理同一个请求,所以必须定义上下文结构