zoukankan      html  css  js  c++  java
  • Flask快速入门(14) — 请求上下文2

    在视图函数中使用request、session是怎么实现请求的呢?

    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与session都是属于同一个类,但是打印的结果不一样。那来看看内部实现源码,比如request.args。request是一个全局变量,点击去可以看到request = LocalProxy(partial(_lookup_req_object, "request"))同理session也是这个类,就拿request来进行分析:

    request是LocalProxy的一个实例对象,参数是local=partial(_lookup_req_object, "request")是一个偏函数。调用_lookup_req_object方法,将request当做第一个参数传入。先看看这个偏函数

    1. partial(_lookup_req_object, "request")

    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中获得“request”。再看看request.args实际上是从LocalProxy获取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)
    
  • 相关阅读:
    javascript延迟对象
    Fetch-新一代Ajax API
    AJAX笔记
    VR/AR/MR
    为什么Javascript有设计缺陷
    Javascript函数式编程
    vim基本操作
    Git 常用命令(二)
    SSH配置
    C# NPOI导出Excel和EPPlus导出Excel
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11705077.html
Copyright © 2011-2022 走看看