Source code for flask_unchained.flask_unchained
from types import FunctionType
from typing import *
import flask
from .unchained import Unchained, unchained
from .utils import AttrDict
class AttrDictFlaskConfig(AttrDict, flask.Config):
"""
The config class for Flask Unchained. Implements attribute access for
config options, eg the following are equivalent::
# reading values
secret_key = app.config['SECRET_KEY']
secret_key = app.config.SECRET_KEY
# setting values
app.config['SECRET_KEY'] = 'super-secret'
app.config.SECRET_KEY = 'super-secret'
Otherwise the same as :class:`flask.Config`.
"""
[docs]class FlaskUnchained(flask.Flask):
"""
A simple subclass of :class:`flask.Flask`. Overrides
:meth:`register_blueprint` and :meth:`add_url_rule` to support
automatic (optional) registration of URLs prefixed with a language code.
"""
config_class = AttrDictFlaskConfig
env: str = None
"""
The environment the application is running in. Will be one of ``development``,
``production``, ``staging``, or ``test``.
"""
# NOTE: the following all get set by ControllerBundle.before_init_app
# jinja_environment = UnchainedJinjaEnvironment
# jinja_options = {**app.jinja_options,
# 'loader': UnchainedJinjaLoader(app)}
# jinja_env.globals['url_for'] = url_for
unchained: Unchained = unchained
"""
The :class:`~flask_unchained.Unchained` extension instance.
"""
[docs] def register_blueprint(self,
blueprint: flask.Blueprint,
*,
register_with_babel: bool = True,
**options: Any,
) -> None:
"""
The same as :meth:`flask.Flask.register_blueprint`, but if
``register_with_babel`` is True, then we also allow the Babel Bundle an
opportunity to register language code prefixed URLs.
"""
if self.unchained.babel_bundle and register_with_babel:
self.unchained.babel_bundle.register_blueprint(self, blueprint, **options)
super().register_blueprint(blueprint, **options)
[docs] def add_url_rule(self,
rule: str,
endpoint: Optional[str] = None,
view_func: Optional[FunctionType] = None,
provide_automatic_options: Optional[bool] = None,
*,
register_with_babel: bool = False,
**options: Any,
) -> None:
"""
The same as :meth:`flask.Flask.add_url_rule`, but if ``register_with_babel``
is True, then we also allow the Babel Bundle an opportunity to register a
language code prefixed URL.
"""
if self.unchained.babel_bundle and register_with_babel:
self.unchained.babel_bundle.add_url_rule(
self, rule, endpoint=endpoint, view_func=view_func,
provide_automatic_options=provide_automatic_options, **options)
super().add_url_rule(
rule, endpoint=endpoint, view_func=view_func,
provide_automatic_options=provide_automatic_options, **options)
def __str__(self):
return f"<FlaskUnchained module={self.import_name!r}>"
def __repr__(self):
return self.__str__()
__all__ = [
'FlaskUnchained',
]