# -*- coding: utf-8 -*- from functools import wraps from hashlib import md5 from os import path from traceback import format_exc from flask.ext.mako import render_template, TemplateError __all__ = ["catch_errors", "set_up_hash_caching"] def catch_errors(app): def callback(func): @wraps(func) def inner(*args, **kwargs): try: return func(*args, **kwargs) except TemplateError as exc: app.logger.error(u"Caught exception:\n{0}".format(exc.text)) return render_template("error.mako", traceback=exc.text) except Exception: app.logger.exception(u"Caught exception:") return render_template("error.mako", traceback=format_exc()) return inner return callback def set_up_hash_caching(app): def callback(app, error, endpoint, values): if endpoint == "static" and "file" in values: fpath = path.join(app.static_folder, values["file"]) mtime = path.getmtime(fpath) cache = app._hash_cache.get(fpath) if cache and cache[0] == mtime: hashstr = cache[1] else: with open(fpath, "rb") as f: hashstr = md5(f.read()).hexdigest() app._hash_cache[fpath] = (mtime, hashstr) return "/static/{0}?v={1}".format(values["file"], hashstr) raise error app._hash_cache = {} app.url_build_error_handlers.append(lambda *args: callback(app, *args))