1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- import typing as t
- from functools import partial
- from werkzeug.local import LocalProxy
- from werkzeug.local import LocalStack
- if t.TYPE_CHECKING:
- from .app import Flask
- from .ctx import _AppCtxGlobals
- from .sessions import SessionMixin
- from .wrappers import Request
- _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):
- top = _request_ctx_stack.top
- if top is None:
- raise RuntimeError(_request_ctx_err_msg)
- return getattr(top, name)
- def _lookup_app_object(name):
- top = _app_ctx_stack.top
- if top is None:
- raise RuntimeError(_app_ctx_err_msg)
- return getattr(top, name)
- def _find_app():
- top = _app_ctx_stack.top
- if top is None:
- raise RuntimeError(_app_ctx_err_msg)
- return top.app
- # context locals
- _request_ctx_stack = LocalStack()
- _app_ctx_stack = LocalStack()
- current_app: "Flask" = LocalProxy(_find_app) # type: ignore
- request: "Request" = LocalProxy(partial(_lookup_req_object, "request")) # type: ignore
- session: "SessionMixin" = LocalProxy( # type: ignore
- partial(_lookup_req_object, "session")
- )
- g: "_AppCtxGlobals" = LocalProxy(partial(_lookup_app_object, "g")) # type: ignore
|