(搬运以学习)flask 上下文的实现
引言
本文主要梳理了flask的current_app, request, session, g的实现原理
源码说明
本文使用flask 0.5 版本
application context 和request context
flask有两个context: application context
和request context
这里需要通俗地解释一下application context与request context:
application 指的就是当你调用
app = Flask(__name__)
创建的这个对象app
;request 指的是每次
http
请求发生时,WSGI server
(比如gunicorn)调用Flask.__call__()
之后,在Flask
对象内部创建的Request
对象;application 表示用于响应WSGI请求的应用本身,request 表示每次http请求;
application的生命周期大于request,一个application存活期间,可能发生多次http请求,所以,也就会有多个request
下面通过源码了解一下 flask 如何实现这两种context:
# 代码摘选自flask 0.5 中的ctx.py文件, 进行了部分删减
class _RequestContext(object): def __init__(self, app, environ):
self.app = app
self.request = app.request_class(environ)
self.session = app.open_session(self.request)
self.g = _RequestGlobals()
flask 使用_RequestContext
的代码如下:
class Flask(object): def request_context(self, environ):
return _RequestContext(self, environ)
在Flask
类中,每次请求都会调用这个request_context
函数。这个函数则会创建一个_RequestContext
对象。
值得注意的是:这个对象在创建时,将Flask
实例的本身作为实参传入_RequestContext
自身,因此,self.app = Flask()
。
所以,虽然每次http请求都会创建一个_RequestContext
对象,但是,每次创建的时候都会将同一个Flask
对象传入该对象的app
成员变量,使得:
由同一个Flask对象响应的请求所创建的_RequestContext对象的app成员变量都共享同一个application
通过在Flask
对象中创建_RequestContext
对象,并将Flask
自身作为参数传入_RequestContext
对象的方式,实现了多个request context对应一个application context 的目的。
接下来,看self.request = app.request_class(environ)
这句。
由于app
成员变量就是app = Flask(__name__)
这个对象,所以,app.request_class
就是Flask.request_class
。
在Flask
类的定义中:
request_class = Request # Request 是一个类,定义如下: class Request(RequestBase):
...
所以:self.request = app.request_class(environ)
实际上是创建了一个Request
对象。
由于,一个http请求对应一个_RequestContext
对象的创建,而每个_RequestContext
对象的创建对应一个Request
对象的创建,所以,每个http请求对应一个Request
对象。
到这里想必已经很清楚了:
application 就是指app = Flask(__name__)
对象
request 就是对应每次http 请求创建的Request
对象
flask通过_RequestContext
将app
与Request
关联起来
总结
app = Flask(__name__)
创建了application, 这个application对应的上下文,就是application contextFlask
每响应一个http请求,就会创建一个Request
对象,这个request对象对应的上下文,就是request context
(搬运以学习)flask 上下文的实现的更多相关文章
- 用尽洪荒之力学习Flask源码
WSGIapp.run()werkzeug@app.route('/')ContextLocalLocalStackLocalProxyContext CreateStack pushStack po ...
- flask上下文详解
一.前言 了解过flask的python开发者想必都知道flask中核心机制莫过于上下文管理,当然学习flask如果不了解其中的处理流程,可能在很多问题上不能得到解决,当然我在写本篇文章之前也看到了很 ...
- Flask上下文管理、session原理和全局g对象
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- 学习Flask框架
# -*- encoding: utf-8 -*- #导包 from flask import Flask #建立flask对象 app = Flask(__name__) #使用flask路由器 ...
- 初步了解学习flask轻量级框架,
关于flask我有话说 flask作为一个轻量级框架,它里面有好多扩展包需要下载,比较麻烦,而且有的时候flask需要在虚拟环境下运行,但是他的优点还是有滴 ,只要是用过Django的人,都会觉得fl ...
- flask上下文全局变量,程序上下文、请求上下文、上下文钩子
Flask上下文 Flask中有两种上下文,程序上下文(application context)和请求上下文(request context) 当客户端发来请求时,请求上下文就登场了.请求上下文里包含 ...
- Flask上下文管理
一.一些python的知识 1.偏函数 def add(x, y, z): print(x + y + z) # 原本的写法:x,y,z可以传任意数字 add(1,2,3) # 如果我要实现一个功能, ...
- Flask 上下文(Context)原理解析
:first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } img { border: 0; m ...
- 学习flask的网址
学习flask的网址: http://www.bjhee.com
随机推荐
- C++里创建 Trie字典树(中文词典)(一)(插入、遍历)
萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...
- Dubbo与Zookeeper、Spring整合使用 maven+springmvc+dubbo+zookeeper
为什么要用dubbo? 还是让官方来解释吧: http://dubbo.io/User+Guide-zh.htm http://dubbo.io/ 一般 nginx+tomcat | - ...
- 51nod 1597 有限背包计数问题 (背包 分块)
题意 题目链接 Sol 不会做啊AAA.. 暴力上肯定是不行的,考虑根号分组 设\(m = \sqrt{n}\) 对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下 ...
- IMG标签与before,after伪类
在CSS中总有一些你不用不知道,用到才知道的“坑”.比如今天要谈的,把 before, after 伪类用在 <img> 标签上.嗯,实际上你用你会发现,在大多数浏览器这是无效的,dom中 ...
- Windows 消息框架: SDK教程
关键字:WindowsSDK 消息机制 http://www.codeproject.com/Articles/599/Windows-Message-Handling-Part-3 Handling ...
- C#设计模式之代理模式(三)
15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求. ...
- mysqldump备份脚本一例
参考三思老师书中所写,感觉挺好用,记录下来,虽然是抄袭,但是手抄还是很累的,其中用到的其他脚本,在博客中已经记录: mysql_full_backup.sh#!/bin/sh#Created by C ...
- Opencv4android的Android Studio环境配置及项目实例下载
因为软件竞赛的项目会用到Opencv for Android,所以就研究了一下如何在Android Studio上配置Opencv4Android 环境概述: Android Studio 2.3 O ...
- OC category(分类)
// ()代表着是一个分类 // ()中的Test代表着分类的名称 @interface Student (Test) // 分类只能扩展方法,不能增加成员变量 - (void)test2; @end
- Codeforces Round #429
Table of Contents A. Generous KefaB. GodsendC. Leha and Function A. Generous Kefa One day Kefa found ...