async def runner(app: Sanic, app_server: AsyncioServer): app.is_running = True try: app.signalize() app.finalize() ErrorHandler.finalize(app.error_handler) app_server.init = True await app_server.before_start() await app_server.after_start() await app_server.serve_forever() finally: app.is_running = False app.is_stopping = True
def __init__(self, name=None, router=None, error_handler=None): # Only set up a default log handler if the # end-user application didn't set anything up. if not logging.root.handlers and log.level == logging.NOTSET: formatter = logging.Formatter( "%(asctime)s: %(levelname)s: %(message)s") handler = logging.StreamHandler() handler.setFormatter(formatter) log.addHandler(handler) log.setLevel(logging.INFO) # Get name from previous stack frame if name is None: frame_records = stack()[1] name = getmodulename(frame_records[1]) self.name = name self.router = router or Router() self.error_handler = error_handler or ErrorHandler() self.config = Config() self.request_middleware = deque() self.response_middleware = deque() self.blueprints = {} self._blueprint_order = [] self.debug = None self.sock = None self.listeners = defaultdict(list) self.is_running = False self.websocket_enabled = False self.websocket_tasks = [] # Register alternative method names self.go_fast = self.run
def __init__(self, name=None, router=None, error_handler=None, load_env=True, request_class=None, strict_slashes=False, log_config=None, configure_logging=True): # Get name from previous stack frame if name is None: frame_records = stack()[1] name = getmodulename(frame_records[1]) # logging if configure_logging: logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) self.name = name self.router = router or Router() self.request_class = request_class self.error_handler = error_handler or ErrorHandler() self.config = Config(load_env=load_env) self.request_middleware = deque() self.response_middleware = deque() self.blueprints = {} self._blueprint_order = [] self.configure_logging = configure_logging self.debug = None self.sock = None self.strict_slashes = strict_slashes self.listeners = defaultdict(list) self.is_running = False self.is_request_stream = False self.websocket_enabled = False self.websocket_tasks = set() # Register alternative method names self.go_fast = self.run
def __init__( self, name: str = None, router: Router = None, error_handler: ErrorHandler = None, load_env: bool = True, request_class: Type[Request] = None, strict_slashes: bool = False, log_config: Optional[Dict[str, Any]] = None, configure_logging: bool = True, register: Optional[bool] = None, dumps: Optional[Callable[..., str]] = None, ) -> None: super().__init__() if name is None: raise SanicException( "Sanic instance cannot be unnamed. " "Please use Sanic(name='your_application_name') instead.", ) # logging if configure_logging: logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) self.name = name self.asgi = False self.router = router or Router() self.request_class = request_class self.error_handler = error_handler or ErrorHandler() self.config = Config(load_env=load_env) self.request_middleware: Deque[MiddlewareType] = deque() self.response_middleware: Deque[MiddlewareType] = deque() self.blueprints: Dict[str, Blueprint] = {} self._blueprint_order: List[Blueprint] = [] self.configure_logging = configure_logging self.debug = None self.sock = None self.strict_slashes = strict_slashes self.listeners: Dict[str, List[ListenerType]] = defaultdict(list) self.is_stopping = False self.is_running = False self.websocket_enabled = False self.websocket_tasks: Set[Future] = set() self.named_request_middleware: Dict[str, Deque[MiddlewareType]] = {} self.named_response_middleware: Dict[str, Deque[MiddlewareType]] = {} self._test_manager = None self._test_client = None self._asgi_client = None # Register alternative method names self.go_fast = self.run if register is not None: self.config.REGISTER = register if self.config.REGISTER: self.__class__.register_app(self) self.router.ctx.app = self if dumps: BaseHTTPResponse._dumps = dumps
def test_setting_fallback_on_config_changes_as_expected(app): app.error_handler = ErrorHandler() _, response = app.test_client.get("/error") assert response.content_type == "text/html; charset=utf-8" app.config.FALLBACK_ERROR_FORMAT = "text" _, response = app.test_client.get("/error") assert response.content_type == "text/plain; charset=utf-8"
def __init__( self, name=None, router=None, error_handler=None, load_env=True, request_class=None, strict_slashes=False, log_config=None, configure_logging=True, register=None, ): # Get name from previous stack frame if name is None: raise SanicException( "Sanic instance cannot be unnamed. " "Please use Sanic(name='your_application_name') instead.", ) # logging if configure_logging: logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) self.name = name self.asgi = False self.router = router or Router(self) self.request_class = request_class self.error_handler = error_handler or ErrorHandler() self.config = Config(load_env=load_env) self.request_middleware = deque() self.response_middleware = deque() self.blueprints = {} self._blueprint_order = [] self.configure_logging = configure_logging self.debug = None self.sock = None self.strict_slashes = strict_slashes self.listeners = defaultdict(list) self.is_stopping = False self.is_running = False self.is_request_stream = False self.websocket_enabled = False self.websocket_tasks = set() self.named_request_middleware = {} self.named_response_middleware = {} # Register alternative method names self.go_fast = self.run if register is not None: self.config.REGISTER = register if self.config.REGISTER: self.__class__.register_app(self)
def __init__( self, name=None, router=None, error_handler=None, load_env=True, request_class=None, strict_slashes=False, log_config=None, configure_logging=True, ): # Get name from previous stack frame if name is None: warnings.warn( "Sanic(name=None) is deprecated and None value support " "for `name` will be removed in the next release. " "Please use Sanic(name='your_application_name') instead.", DeprecationWarning, stacklevel=2, ) frame_records = stack()[1] name = getmodulename(frame_records[1]) # logging if configure_logging: logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) self.name = name self.asgi = False self.router = router or Router() self.request_class = request_class self.error_handler = error_handler or ErrorHandler() self.config = Config(load_env=load_env) self.request_middleware = deque() self.response_middleware = deque() self.blueprints = {} self._blueprint_order = [] self.configure_logging = configure_logging self.debug = None self.sock = None self.strict_slashes = strict_slashes self.listeners = defaultdict(list) self.is_stopping = False self.is_running = False self.is_request_stream = False self.websocket_enabled = False self.websocket_tasks = set() self.named_request_middleware = {} self.named_response_middleware = {} # Register alternative method names self.go_fast = self.run
def test_setting_fallback_to_non_default_raise_warning(app): app.error_handler = ErrorHandler(fallback="text") assert app.error_handler.fallback == "text" with pytest.warns( UserWarning, match=("Overriding non-default ErrorHandler fallback value. " "Changing from text to auto."), ): app.config.FALLBACK_ERROR_FORMAT = "auto" assert app.error_handler.fallback == "auto" app.config.FALLBACK_ERROR_FORMAT = "text" with pytest.warns( UserWarning, match=("Overriding non-default ErrorHandler fallback value. " "Changing from text to json."), ): app.config.FALLBACK_ERROR_FORMAT = "json" assert app.error_handler.fallback == "json"
def test_exception_handler_lookup(): class CustomError(Exception): pass class CustomServerError(ServerError): pass def custom_error_handler(): pass def server_error_handler(): pass def import_error_handler(): pass try: ModuleNotFoundError except Exception: class ModuleNotFoundError(ImportError): pass handler = ErrorHandler() handler.add(ImportError, import_error_handler) handler.add(CustomError, custom_error_handler) handler.add(ServerError, server_error_handler) assert handler.lookup(ImportError()) == import_error_handler assert handler.lookup(ModuleNotFoundError()) == import_error_handler assert handler.lookup(CustomError()) == custom_error_handler assert handler.lookup(ServerError("Error")) == server_error_handler assert handler.lookup(CustomServerError("Error")) == server_error_handler # once again to ensure there is no caching bug assert handler.lookup(ImportError()) == import_error_handler assert handler.lookup(ModuleNotFoundError()) == import_error_handler assert handler.lookup(CustomError()) == custom_error_handler assert handler.lookup(ServerError("Error")) == server_error_handler assert handler.lookup(CustomServerError("Error")) == server_error_handler
def test_exception_handler_lookup(): class CustomError(Exception): pass class CustomServerError(ServerError): pass def custom_error_handler(): pass def server_error_handler(): pass def import_error_handler(): pass try: ModuleNotFoundError except: class ModuleNotFoundError(ImportError): pass handler = ErrorHandler() handler.add(ImportError, import_error_handler) handler.add(CustomError, custom_error_handler) handler.add(ServerError, server_error_handler) assert handler.lookup(ImportError()) == import_error_handler assert handler.lookup(ModuleNotFoundError()) == import_error_handler assert handler.lookup(CustomError()) == custom_error_handler assert handler.lookup(ServerError('Error')) == server_error_handler assert handler.lookup(CustomServerError('Error')) == server_error_handler # once again to ensure there is no caching bug assert handler.lookup(ImportError()) == import_error_handler assert handler.lookup(ModuleNotFoundError()) == import_error_handler assert handler.lookup(CustomError()) == custom_error_handler assert handler.lookup(ServerError('Error')) == server_error_handler assert handler.lookup(CustomServerError('Error')) == server_error_handler
def test_exception_handler_lookup(exception_handler_app: Sanic): class CustomError(Exception): pass class CustomServerError(ServerError): pass def custom_error_handler(): pass def server_error_handler(): pass def import_error_handler(): pass try: ModuleNotFoundError except Exception: class ModuleNotFoundError(ImportError): pass handler = ErrorHandler("auto") handler.add(ImportError, import_error_handler) handler.add(CustomError, custom_error_handler) handler.add(ServerError, server_error_handler) assert handler.lookup(ImportError(), None) == import_error_handler assert handler.lookup(ModuleNotFoundError(), None) == import_error_handler assert handler.lookup(CustomError(), None) == custom_error_handler assert handler.lookup(ServerError("Error"), None) == server_error_handler assert (handler.lookup(CustomServerError("Error"), None) == server_error_handler) # once again to ensure there is no caching bug assert handler.lookup(ImportError(), None) == import_error_handler assert handler.lookup(ModuleNotFoundError(), None) == import_error_handler assert handler.lookup(CustomError(), None) == custom_error_handler assert handler.lookup(ServerError("Error"), None) == server_error_handler assert (handler.lookup(CustomServerError("Error"), None) == server_error_handler)
def __init__( self, name: str = None, config: Optional[Config] = None, ctx: Optional[Any] = None, router: Optional[Router] = None, signal_router: Optional[SignalRouter] = None, error_handler: Optional[ErrorHandler] = None, load_env: Union[bool, str] = True, env_prefix: Optional[str] = SANIC_PREFIX, request_class: Optional[Type[Request]] = None, strict_slashes: bool = False, log_config: Optional[Dict[str, Any]] = None, configure_logging: bool = True, register: Optional[bool] = None, dumps: Optional[Callable[..., str]] = None, ) -> None: super().__init__(name=name) # logging if configure_logging: logging.config.dictConfig(log_config or LOGGING_CONFIG_DEFAULTS) if config and (load_env is not True or env_prefix != SANIC_PREFIX): raise SanicException( "When instantiating Sanic with config, you cannot also pass " "load_env or env_prefix") self._asgi_client = None self._blueprint_order: List[Blueprint] = [] self._test_client = None self._test_manager = None self.asgi = False self.auto_reload = False self.blueprints: Dict[str, Blueprint] = {} self.config = config or Config(load_env=load_env, env_prefix=env_prefix) self.configure_logging = configure_logging self.ctx = ctx or SimpleNamespace() self.debug = None self.error_handler = error_handler or ErrorHandler() self.is_running = False self.is_stopping = False self.listeners: Dict[str, List[ListenerType]] = defaultdict(list) self.named_request_middleware: Dict[str, Deque[MiddlewareType]] = {} self.named_response_middleware: Dict[str, Deque[MiddlewareType]] = {} self.request_class = request_class self.request_middleware: Deque[MiddlewareType] = deque() self.response_middleware: Deque[MiddlewareType] = deque() self.router = router or Router() self.signal_router = signal_router or SignalRouter() self.sock = None self.strict_slashes = strict_slashes self.websocket_enabled = False self.websocket_tasks: Set[Future] = set() # Register alternative method names self.go_fast = self.run if register is not None: self.config.REGISTER = register if self.config.REGISTER: self.__class__.register_app(self) self.router.ctx.app = self if dumps: BaseHTTPResponse._dumps = dumps
def init_handler(): handler = ErrorHandler() handler.add(InvalidRequest, error_handler) handler.add(InvalidToken, error_handler) return handler
def error_handle(app: Sanic): handler = ErrorHandler() handler.add(ValidationError, lambda r, e: json({"message": str(e.messages)}, status=400)) handler.add( SanicException, lambda r, e: json({"message": e.__str__()}, status=e.status_code)) handler.add(SchemaException, lambda r, e: json({"message": e.__str__()}, 400)) handler.add(ApiException, lambda r, e: json({"message": e.msg}, status=e.code)) handler.add(PostgresError, lambda r, e: json({"message": e.__str__()}, status=500)) def handler_exception(r, e): error_logger.exception(e) return json({"message": e.__str__()}, status=500) handler.add(Exception, handler_exception) app.error_handler = handler