123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import typing as t
- from contextvars import ContextVar
- from werkzeug.local import LocalProxy
- if t.TYPE_CHECKING: # pragma: no cover
- from .app import Flask
- from .ctx import _AppCtxGlobals
- from .ctx import AppContext
- from .ctx import RequestContext
- from .sessions import SessionMixin
- from .wrappers import Request
- class _FakeStack:
- def __init__(self, name: str, cv: ContextVar[t.Any]) -> None:
- self.name = name
- self.cv = cv
- def _warn(self):
- import warnings
- warnings.warn(
- f"'_{self.name}_ctx_stack' is deprecated and will be"
- " removed in Flask 2.3. Use 'g' to store data, or"
- f" '{self.name}_ctx' to access the current context.",
- DeprecationWarning,
- stacklevel=3,
- )
- def push(self, obj: t.Any) -> None:
- self._warn()
- self.cv.set(obj)
- def pop(self) -> t.Any:
- self._warn()
- ctx = self.cv.get(None)
- self.cv.set(None)
- return ctx
- @property
- def top(self) -> t.Optional[t.Any]:
- self._warn()
- return self.cv.get(None)
- _no_app_msg = """\
- Working outside of application context.
- This typically means that you attempted to use functionality that needed
- the current application. To solve this, set up an application context
- with app.app_context(). See the documentation for more information.\
- """
- _cv_app: ContextVar["AppContext"] = ContextVar("flask.app_ctx")
- __app_ctx_stack = _FakeStack("app", _cv_app)
- app_ctx: "AppContext" = LocalProxy( # type: ignore[assignment]
- _cv_app, unbound_message=_no_app_msg
- )
- current_app: "Flask" = LocalProxy( # type: ignore[assignment]
- _cv_app, "app", unbound_message=_no_app_msg
- )
- g: "_AppCtxGlobals" = LocalProxy( # type: ignore[assignment]
- _cv_app, "g", unbound_message=_no_app_msg
- )
- _no_req_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.\
- """
- _cv_request: ContextVar["RequestContext"] = ContextVar("flask.request_ctx")
- __request_ctx_stack = _FakeStack("request", _cv_request)
- request_ctx: "RequestContext" = LocalProxy( # type: ignore[assignment]
- _cv_request, unbound_message=_no_req_msg
- )
- request: "Request" = LocalProxy( # type: ignore[assignment]
- _cv_request, "request", unbound_message=_no_req_msg
- )
- session: "SessionMixin" = LocalProxy( # type: ignore[assignment]
- _cv_request, "session", unbound_message=_no_req_msg
- )
- def __getattr__(name: str) -> t.Any:
- if name == "_app_ctx_stack":
- import warnings
- warnings.warn(
- "'_app_ctx_stack' is deprecated and will be remoevd in Flask 2.3.",
- DeprecationWarning,
- stacklevel=2,
- )
- return __app_ctx_stack
- if name == "_request_ctx_stack":
- import warnings
- warnings.warn(
- "'_request_ctx_stack' is deprecated and will be remoevd in Flask 2.3.",
- DeprecationWarning,
- stacklevel=2,
- )
- return __request_ctx_stack
- raise AttributeError(name)
|