flask源码之全局变量

Posted 摩羯男

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask源码之全局变量相关的知识,希望对你有一定的参考价值。

引言:

  flask全局变量,里边包含了几乎常用的双下方法以及对这些方法flask又做了定制化,那么这样的话几乎教会了我们怎么去使用这些双下方法,并且有个生僻的东西叫偏函数(冻结函数)

 

代码:

  入口    import flask.globals

# -*- coding: utf-8 -*-

from functools import partial

from werkzeug.local import LocalProxy
from werkzeug.local import LocalStack


_request_ctx_err_msg = """\\
Working outside of request context.

This typically means that you attempted to use functionality that needed
an active HTTP request.  Consult the documentation on testing for
information about how to avoid this problem.\\
"""
_app_ctx_err_msg = """\\
Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.\\
"""


def _lookup_req_object(name):
    # name=request
    # _request_ctx_stack 就是globals中的 LocalStack() 对象
    # top方法拿到 requestContext也就是ctx 即 top=ctx
    top = _request_ctx_stack.top
    if top is None:
        raise RuntimeError(_request_ctx_err_msg)
    # 这里就相当于 去ctx中取request 
    return getattr(top, name)


def _lookup_app_object(name):
    top = _app_ctx_stack.top
    if top is None:
        raise RuntimeError(_app_ctx_err_msg)
    # name= request  这就是 ctx.push 中调用 requet_context 的 request=request_class
    return getattr(top, name)


def _find_app():
    # 这里同 request session g 同理
    top = _app_ctx_stack.top
    if top is None:
        raise RuntimeError(_app_ctx_err_msg)
    return top.app

"""
LocalStack LocalProxy Local
"""



# context locals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()

# 在使用 current_app 可以被直接导入使用 _find_app 从栈中拿到了程序的上下文 不过没有使用偏函数
current_app = LocalProxy(_find_app)
# 同 current_app 就可以在 视图函数中导入该 app
# capp=LocalProxy(partial(_lookup_app_object,\'app\'))

# 以后执行 函数 partial(_lookup_req_object, "request") 时 自动传递 request参数
# 查看源码 先去Local中拿到 RequestContext 对象 也就是ctx 这个对象中有request对象和session对象
# (_lookup_req_object, "request") 偏函数
request = LocalProxy(partial(_lookup_req_object, "request"))
#  同上 去ctx中获取 sesison
session = LocalProxy(partial(_lookup_req_object, "session"))
g = LocalProxy(partial(_lookup_app_object, "g"))

  这里变核心的代码 设计到 三个类    LocalStack    LocalProxy  Local 关系如下图

 

以上是关于flask源码之全局变量的主要内容,如果未能解决你的问题,请参考以下文章

Flask上下文管理源码分析

Flask上下文源码分析

C#-WebForm-★内置对象简介★Request-获取请求对象Response相应请求对象Session全局变量(私有)Cookie全局变量(私有)Application全局公共变量Vi(代码片段

Flask源码复习之路由

Flask拾遗笔记之上下文

[flask]flask_login模块,session及其他