接触
python
也有一段时间了,
python
相关的框架和模块也接触了不少,希望把自己接
触到的自己
觉得比较好的设计和实现分享给大家,于是取了一个“
charming
python
”的小
标,算是给自己开了一个头吧,
希望大家多多批评指正。
:)
from flask import request
flask
是一个人气非常高的
python web
框架,
笔者也拿它写过一些大大小小的项目,
flask
有一个特性我非常的喜欢,就是无论在什么地方,如果你想要获取当前的
request
对象,只
要
简单的:
代码如下
:
from flask import request
#
从当前
request
获取内容
request.args
request.forms
request.cookies
... ...
非常简单好记,
用起来也非常的友好。
不过,
简单的背后藏的实现可就稍微有一些复杂
了。
跟随我的文章来看看其中的奥秘吧!
两个疑问?
在我们往下看之前,我们先提出两个疑问:
疑问一
:
request
,看上去只像是一个静态的类实例,我们为什么可以直接使用
request.args
这样的表达式来获取当前
request
的
args
属性,而不用使用比如:
代码如下
:
from flask import get_request
#
获取当前
request
request = get_request()
get_request().args
这样的方式呢?
flask
是怎么把
request
对应到当前的请求对象的呢?
疑问二
:
在真正的生产环境中,同一个工作进程下面可能有很多个线程(又或者是协
程)
,
就像我刚刚所说的,
request
这个类实例是怎么在这样的环境下正常工作的呢?
要知道其中的秘密,我们只能从
flask
的源码开始看了。
源码,源码,还是源码
首先我们打开
flask
的源码,从最开始的
__init__.py
来看看
request
是怎么出来的:
代码如下
:
# file: flask/__init__.py
from .globals import current_app, g, request, session, _request_ctx_stack
# file: flask/globals.py
from functools import partial
from werkzeug.local import localstack, localproxy
def _lookup_req_object(name):
top = _request_ctx_stack.top
if top is none:
raise runtimeerror('working outside of request context')
return getattr(top, name)