from functools import wraps from flask import request, render_template, url_for from flask import redirect as _redirect def _gen_tpl(endpoint): return endpoint.replace('.', '/') + '.jinja' def templated(template=None): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if template is None: template_name = _gen_tpl(request.endpoint) elif template[0] == '.' and request.blueprint is not None: template_name = _gen_tpl(request.blueprint + template) else: template_name = template ctx = f(*args, **kwargs) if ctx is None: ctx = {} elif not isinstance(ctx, dict): return ctx return render_template(template_name, **ctx) return decorated_function return decorator def redirect (target, **kwargs): code = kwargs.pop("_code", None) url = url_for(target, **kwargs) if code is None: return _redirect(url) else: return _redirect(url, code)