access names as proxies directly

This commit is contained in:
David Lord 2022-06-27 07:57:03 -07:00
parent 89463cb77c
commit 0b2f809f9b
No known key found for this signature in database
GPG key ID: 7A1C87E3F5BC42A8

View file

@ -1,59 +1,50 @@
import typing as t import typing as t
from functools import partial from contextvars import ContextVar
from werkzeug.local import LocalProxy
from werkzeug.local import LocalStack from werkzeug.local import LocalStack
if t.TYPE_CHECKING: # pragma: no cover if t.TYPE_CHECKING: # pragma: no cover
from .app import Flask from .app import Flask
from .ctx import _AppCtxGlobals from .ctx import _AppCtxGlobals
from .ctx import AppContext
from .ctx import RequestContext
from .sessions import SessionMixin from .sessions import SessionMixin
from .wrappers import Request from .wrappers import Request
_request_ctx_err_msg = """\ _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[t.List["AppContext"]] = ContextVar("flask.app_ctx")
_app_ctx_stack: LocalStack["AppContext"] = LocalStack(_cv_app)
app_ctx: "AppContext" = _app_ctx_stack( # type: ignore[assignment]
unbound_message=_no_app_msg
)
current_app: "Flask" = _app_ctx_stack( # type: ignore[assignment]
"app", unbound_message=_no_app_msg
)
g: "_AppCtxGlobals" = _app_ctx_stack( # type: ignore[assignment]
"g", unbound_message=_no_app_msg
)
_no_req_msg = """\
Working outside of request context. Working outside of request context.
This typically means that you attempted to use functionality that needed This typically means that you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.\ information about how to avoid this problem.\
""" """
_app_ctx_err_msg = """\ _cv_req: ContextVar[t.List["RequestContext"]] = ContextVar("flask.request_ctx")
Working outside of application context. _request_ctx_stack: LocalStack["RequestContext"] = LocalStack(_cv_req)
request_ctx: "RequestContext" = _request_ctx_stack( # type: ignore[assignment]
This typically means that you attempted to use functionality that needed unbound_message=_no_req_msg
to interface with the current application object in some way. To solve )
this, set up an application context with app.app_context(). See the request: "Request" = _request_ctx_stack( # type: ignore[assignment]
documentation for more information.\ "request", unbound_message=_no_req_msg
""" )
session: "SessionMixin" = _request_ctx_stack( # type: ignore[assignment]
"session", unbound_message=_no_req_msg
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