mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-14 10:30:51 +03:00
Add Flask extension module
This commit is contained in:
parent
2f74c86d62
commit
f5bc3a5759
|
@ -2,15 +2,82 @@
|
||||||
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
|
|
||||||
|
from dependency_injector import providers, errors
|
||||||
|
|
||||||
def create_app(name, routes):
|
|
||||||
app = Flask(name)
|
def create_app(name, routes, **kwargs):
|
||||||
|
"""Create Flask app and add routes."""
|
||||||
|
app = Flask(name, **kwargs)
|
||||||
for route in routes:
|
for route in routes:
|
||||||
app.add_url_rule(*route.args, **route.kwargs)
|
app.add_url_rule(*route.args, **route.options)
|
||||||
return app
|
return app
|
||||||
|
|
||||||
|
|
||||||
|
def as_view(provider, name=None):
|
||||||
|
"""Transform class-based view provider to view function."""
|
||||||
|
if isinstance(provider, providers.Factory):
|
||||||
|
def view(*args, **kwargs):
|
||||||
|
self = provider()
|
||||||
|
return self.dispatch_request(*args, **kwargs)
|
||||||
|
|
||||||
|
assert name, 'Argument "endpoint" is required for class-based views'
|
||||||
|
view.__name__ = name
|
||||||
|
elif isinstance(provider, providers.Callable):
|
||||||
|
def view(*args, **kwargs):
|
||||||
|
return provider(*args, **kwargs)
|
||||||
|
|
||||||
|
view.__name__ = provider.provides.__name__
|
||||||
|
else:
|
||||||
|
raise errors.Error('Undefined provider type')
|
||||||
|
|
||||||
|
view.__doc__ = provider.provides.__doc__
|
||||||
|
view.__module__ = provider.provides.__module__
|
||||||
|
|
||||||
|
if isinstance(provider.provides, type):
|
||||||
|
view.view_class = provider.provides
|
||||||
|
|
||||||
|
if hasattr(provider.provides, 'decorators'):
|
||||||
|
for decorator in provider.provides.decorators:
|
||||||
|
view = decorator(view)
|
||||||
|
|
||||||
|
if hasattr(provider.provides, 'methods'):
|
||||||
|
view.methods = provider.provides.methods
|
||||||
|
|
||||||
|
if hasattr(provider.provides, 'provide_automatic_options'):
|
||||||
|
view.provide_automatic_options = provider.provides.provide_automatic_options
|
||||||
|
|
||||||
|
return view
|
||||||
|
|
||||||
|
|
||||||
class Route:
|
class Route:
|
||||||
def __init__(self, *args, **kwargs):
|
"""Route is a glue for Dependency Injector providers and Flask views."""
|
||||||
self.args = args
|
|
||||||
self.kwargs = kwargs
|
def __init__(
|
||||||
|
self,
|
||||||
|
rule,
|
||||||
|
endpoint=None,
|
||||||
|
view_provider=None,
|
||||||
|
provide_automatic_options=None,
|
||||||
|
**options,
|
||||||
|
):
|
||||||
|
"""Initialize route."""
|
||||||
|
self.view_provider = view_provider
|
||||||
|
self.args = (rule, endpoint, as_view(view_provider, endpoint), provide_automatic_options)
|
||||||
|
self.options = options
|
||||||
|
|
||||||
|
def __deepcopy__(self, memo):
|
||||||
|
"""Create and return full copy of provider."""
|
||||||
|
copied = memo.get(id(self))
|
||||||
|
if copied is not None:
|
||||||
|
return copied
|
||||||
|
|
||||||
|
rule, endpoint, _, provide_automatic_options = self.args
|
||||||
|
view_provider = providers.deepcopy(self.view_provider, memo)
|
||||||
|
|
||||||
|
return self.__class__(
|
||||||
|
rule,
|
||||||
|
endpoint,
|
||||||
|
view_provider,
|
||||||
|
provide_automatic_options,
|
||||||
|
**self.options,
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user