def test_unhandled_error(self): handler = ErrorHandler(self.app) with self.app.test_request_context("/"): response = None try: self.raise_exception() except Exception as exception: response = handler.handle(exception) assert 500 == response.status_code assert "An internal error occured" == response.data.decode("utf8")
def test_handle_error_as_problem_detail_document(self): handler = ErrorHandler(self.app) with self.app.test_request_context("/"): try: self.raise_exception(CanBeProblemDetailDocument) except Exception as exception: response = handler.handle(exception) assert 400 == response.status_code data = json.loads(response.data.decode("utf8")) assert INVALID_URN.title == data["title"] # Since we are not in debug mode, the debug_message is # destroyed. assert "debug_message" not in data
def test_unhandled_error_debug(self): # Set the sitewide log level to DEBUG to get a stack trace # instead of a generic error message. handler = ErrorHandler(self.app) self.activate_debug_mode() with self.app.test_request_context("/"): response = None try: self.raise_exception() except Exception as exception: response = handler.handle(exception) assert 500 == response.status_code assert response.data.startswith( b"Traceback (most recent call last)")
def initialize_database(autoinitialize=True): db_url = Configuration.database_url() if autoinitialize: SessionManager.initialize(db_url) session_factory = SessionManager.sessionmaker(db_url) _db = flask_scoped_session(session_factory, app) app._db = _db Configuration.load(_db) testing = 'TESTING' in os.environ log_level = LogConfiguration.initialize(_db, testing=testing) if app.debug is None: debug = log_level == 'DEBUG' app.debug = debug else: debug = app.debug app.config['DEBUG'] = debug _db.commit() app.log = logging.getLogger("Metadata web app") app.log.info("Application debug mode: %r", app.debug) for logger in logging.getLogger().handlers: app.log.info("Logs are going to %r", logger) # Register an error handler that logs exceptions through the # normal logging process and tries to turn them into Problem # Detail Documents. h = ErrorHandler(app, app.config['DEBUG']) @app.errorhandler(Exception) def exception_handler(exception): return h.handle(exception)
def test_handle_error_as_problem_detail_document_debug(self): # When in debug mode, the debug_message is preserved and a # stack trace is appended to it. handler = ErrorHandler(self.app) self.activate_debug_mode() with self.app.test_request_context("/"): try: self.raise_exception(CanBeProblemDetailDocument) except Exception as exception: response = handler.handle(exception) assert 400 == response.status_code data = json.loads(response.data.decode("utf8")) assert INVALID_URN.title == data["title"] assert data["debug_message"].startswith( "A debug_message which should only appear in debug mode.\n\n" "Traceback (most recent call last)")
else: resp = make_response(f(*args, **kwargs)) patron_web_domains = app.manager.patron_web_domains if patron_web_domains: options = get_cors_options( app, dict(origins=patron_web_domains, supports_credentials=True) ) set_cors_headers(resp, options) return resp return update_wrapper(wrapped_function, f) h = ErrorHandler(app, app.config["DEBUG"]) @app.errorhandler(Exception) @allows_patron_web def exception_handler(exception): if isinstance(exception, HTTPException): # This isn't an exception we need to handle, it's werkzeug's way # of interrupting normal control flow with a specific HTTP response. # Return the exception and it will be used as the response. return exception return h.handle(exception) def has_library(f): """Decorator to extract the library short name from the arguments."""
patron_web_url = patron_web_integration.get(Configuration.URL) allows_patron_web = partial( cross_origin, origins=[patron_web_url], supports_credentials=True, ) else: # If the patron web client isn't configured, the decorator will do nothing. def allows_patron_web(): def decorated(f): return f return decorated h = ErrorHandler(app, app.config['DEBUG']) @app.errorhandler(Exception) @allows_patron_web() def exception_handler(exception): return h.handle(exception) def dir_route(path, *args, **kwargs): """Decorator to create routes that work with or without a trailing slash.""" if path.endswith("/"): path_without_slash = path[:-1] else: path_without_slash = path