Fixed an issue that prevented the password reset tokens from working. Added email templates for password reset success and new account creation. Added more dynamic email template support.
96 lines
2.9 KiB
Python
96 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
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
|
|
|
|
@property
|
|
def top(self) -> t.Any | None:
|
|
import warnings
|
|
|
|
warnings.warn(
|
|
f"'_{self.name}_ctx_stack' is deprecated and will be removed in Flask 2.4."
|
|
f" Use 'g' to store data, or '{self.name}_ctx' to access the current"
|
|
" context.",
|
|
DeprecationWarning,
|
|
stacklevel=2,
|
|
)
|
|
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 removed in Flask 2.4.",
|
|
DeprecationWarning,
|
|
stacklevel=2,
|
|
)
|
|
return __app_ctx_stack
|
|
|
|
if name == "_request_ctx_stack":
|
|
import warnings
|
|
|
|
warnings.warn(
|
|
"'_request_ctx_stack' is deprecated and will be removed in Flask 2.4.",
|
|
DeprecationWarning,
|
|
stacklevel=2,
|
|
)
|
|
return __request_ctx_stack
|
|
|
|
raise AttributeError(name)
|