python的魔法方法理解_python中的魔法方法深入理解

接触

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值