美文网首页
Flask AppContext何时POP

Flask AppContext何时POP

作者: 霡霂976447044 | 来源:发表于2020-07-02 10:34 被阅读0次

    首先请求进来走到

    def wsgi_app(self, environ, start_response):
            """The actual WSGI application. This is not implemented in
            :meth:`__call__` so that middlewares can be applied without
            losing a reference to the app object. Instead of doing this::
    
                app = MyMiddleware(app)
    
            It's a better idea to do this instead::
    
                app.wsgi_app = MyMiddleware(app.wsgi_app)
    
            Then you still have the original application object around and
            can continue to call methods on it.
    
            .. versionchanged:: 0.7
                Teardown events for the request and app contexts are called
                even if an unhandled error occurs. Other events may not be
                called depending on when an error occurs during dispatch.
                See :ref:`callbacks-and-errors`.
    
            :param environ: A WSGI environment.
            :param start_response: A callable accepting a status code,
                a list of headers, and an optional exception context to
                start the response.
            """
            ctx = self.request_context(environ)
            error = None
            try:
                try:
                    ctx.push()
                    response = self.full_dispatch_request()
                except Exception as e:
                    error = e
                    response = self.handle_exception(e)
                except:  # noqa: B001
                    error = sys.exc_info()[1]
                    raise
                return response(environ, start_response)
            finally:
                if self.should_ignore_error(error):
                    error = None
                ctx.auto_pop(error)
    

    auto_pop函数会调用request上下文pop,在里面会pop掉app上下文

        def auto_pop(self, exc):
            if self.request.environ.get("flask._preserve_context") or (
                exc is not None and self.app.preserve_context_on_exception
            ):
                self.preserved = True
                self._preserved_exc = exc
            else:
                self.pop(exc)
    
     def pop(self, exc=_sentinel):
            """Pops the request context and unbinds it by doing that.  This will
            also trigger the execution of functions registered by the
            :meth:`~flask.Flask.teardown_request` decorator.
    
            .. versionchanged:: 0.9
               Added the `exc` argument.
            """
            app_ctx = self._implicit_app_ctx_stack.pop()
    
            try:
                clear_request = False
                if not self._implicit_app_ctx_stack:
                    self.preserved = False
                    self._preserved_exc = None
                    if exc is _sentinel:
                        exc = sys.exc_info()[1]
                    self.app.do_teardown_request(exc)
    
                    # If this interpreter supports clearing the exception information
                    # we do that now.  This will only go into effect on Python 2.x,
                    # on 3.x it disappears automatically at the end of the exception
                    # stack.
                    if hasattr(sys, "exc_clear"):
                        sys.exc_clear()
    
                    request_close = getattr(self.request, "close", None)
                    if request_close is not None:
                        request_close()
                    clear_request = True
            finally:
                rv = _request_ctx_stack.pop()
    
                # get rid of circular dependencies at the end of the request
                # so that we don't require the GC to be active.
                if clear_request:
                    rv.request.environ["werkzeug.request"] = None
    
                # Get rid of the app as well if necessary.
                if app_ctx is not None:
                    app_ctx.pop(exc)  # pop 掉app ctx
    
                assert rv is self, "Popped wrong request context. (%r instead of %r)" % (
                    rv,
                    self,
                )
    

    这也就是为什么g对象挂载到app上下文下,其它请求过来也无法获取g变量的数据

    相关文章

      网友评论

          本文标题:Flask AppContext何时POP

          本文链接:https://www.haomeiwen.com/subject/wxplqktx.html