"""
:mod:`zsl.router.method`
------------------------
.. moduleauthor:: Martin Babka <babka@atteq.com>
"""
import json
import logging
from flask import request
from flask.wrappers import Response
from zsl import Config, Injected, Zsl, inject
from zsl.application.error_handler import error_handler
from zsl.application.modules.web.configuration import MethodConfiguration
from zsl.constants import MimeType
from zsl.db.model.app_model_json_encoder import AppModelJSONEncoder
from zsl.interface.web.utils.execution import convert_to_web_response, execute_web_task, notify_responders
from zsl.interface.web.utils.request_data import extract_data
from zsl.interface.web.utils.response_headers import append_headers
from zsl.task.job_context import WebJobContext
METHOD_CONFIG_NAME = 'METHOD'
[docs]
@append_headers
def default_web_responder(rv):
if isinstance(rv, Response):
return rv
return Response(json.dumps(rv, cls=AppModelJSONEncoder),
mimetype=MimeType.APPLICATION_JSON.value)
[docs]
def identity_responder(rv):
return rv
[docs]
def set_default_responder(responder):
global _default_responder_method
_default_responder_method = responder
_default_responder_method = default_web_responder
def _get_method_configuration(config):
# type: (Config) -> MethodConfiguration
return config.get(METHOD_CONFIG_NAME, MethodConfiguration())
[docs]
@inject(app=Zsl, config=Config)
def route(path, app=Injected, config=Injected, **options):
def _decorator(f):
method_config = _get_method_configuration(config)
url = "/{0}{1}".format(method_config.url_prefix, path)
logging.getLogger(__name__).info(
"Mapping url '{0}' as a method.".format(url))
routed_function = app.route(url, **options)
return routed_function(Performer(f))
return _decorator
[docs]
@inject(config=Config)
def get_method_packages(config):
return _get_method_configuration(config).packages