フラスコクイックスタート(14) - 2リクエストコンテキスト

[TOC]

機能の観点から要求を使用して、セッション要求は、それを達成する方法ですか?

from flask import Flask,request,session
app = Flask(__name__)

@app.route('/')
def index():
    print(request)  # <Request 'http://127.0.0.1:5000/' [GET]>
    print(type(request))  # <class 'werkzeug.local.LocalProxy'>
    print(session)  # <NullSession {}>
    print(type(session))  # <class 'werkzeug.local.LocalProxy'>
    return 'ok'

if __name__ == '__main__':
    app.run()

印刷は、それが同じクラスに属するセッション要求で見ることができますが、印刷結果は同じではありません。そこで例えば、内部実装のソースコードを見てみましょうrequest.args要求がグローバル変数である、あなたが見て、クリックすることができますrequest = LocalProxy(partial(_lookup_req_object, "request"))同じトークンセッションは、このクラスで、分析のための要求をしました:

パラメータがLocalProxyリクエストは、オブジェクトのインスタンスであるlocal=partial(_lookup_req_object, "request")部分的な機能。呼び出し_lookup_req_object方法、最初の引数として要求を。この部分関数を見てみましょう

1.部分(_lookup_req_object、 "要求")

def _lookup_req_object(name):
    # 获取top.其实点进去发现_request_ctx_stack=LocalStack(),所以执行的是LocalStack.top()方法,top=ctx,name='request'
    top = _request_ctx_stack.top
    if top is None:
        raise RuntimeError(_request_ctx_err_msg)
    return getattr(top, name)

@property
def top(self):
    try:
        return self._local.stack[-1]  # 取出的是ctx
    except (AttributeError, IndexError):
        return None

CTXの現在のリクエストから「要求」を取得します。LocalProxyから引数を取得し、実際にrequest.argsを見てください。したがって、実装__getattr__方法

2. LocalProxy .__ getattr__

def __getattr__(self, name):
    # 在这里name就是args,所以从_get_current_object()去获取
    if name == "__members__":
        return dir(self._get_current_object())
    return getattr(self._get_current_object(), name)  # self._get_current_object()返回的是request,name是args。所以就是从request中去找args

def _get_current_object(self):
    if not hasattr(self.__local, "__release_local__"):
        return self.__local()
    try:
        return getattr(self.__local, self.__name__)  # self.__local里找。而这是实例化中的一个私有属性=传入的参数local=偏函数partial(_lookup_req_object, "request")的返回值=ctx中的request。
    except AttributeError:
        raise RuntimeError("no object bound to %s" % self.__name__))
        
# object.__setattr__(self, "_LocalProxy__local", local)

おすすめ

転載: www.cnblogs.com/863652104kai/p/11705077.html