Преглед изворни кода

Merge pull request #120 from zauberzeug/error500

show 500-error page on errors during page creation
Rodja Trappe пре 2 година
родитељ
комит
15d8f821f5
2 измењених фајлова са 34 додато и 30 уклоњено
  1. 32 28
      nicegui/page.py
  2. 2 2
      tests/test_pages.py

+ 32 - 28
nicegui/page.py

@@ -196,28 +196,29 @@ class page:
                 on_disconnect=self.on_disconnect,
                 shared=self.shared,
             )
-            with globals.within_view(self.page.view):
-                if 'request' in inspect.signature(func).parameters:
-                    if self.shared:
-                        globals.log.error('Cannot use `request` argument in shared page')
-                        return error(501)
-                    kwargs['request'] = request
-                await self.connected(request)
-                await self.header()
-                result = await func(*args, **kwargs) if is_coroutine(func) else func(*args, **kwargs)
-                if isinstance(result, types.GeneratorType):
-                    if self.shared:
-                        globals.log.error('Yielding for page_ready is not supported on shared pages')
-                        return error(501)
-                    next(result)
-                if isinstance(result, types.AsyncGeneratorType):
-                    if self.shared:
-                        globals.log.error('Yielding for page_ready is not supported on shared pages')
-                        return error(501)
-                    await result.__anext__()
-                self.page.page_ready_generator = result
-                await self.footer()
-            return self.page
+            try:
+                with globals.within_view(self.page.view):
+                    if 'request' in inspect.signature(func).parameters:
+                        if self.shared:
+                            raise Exception('Cannot use `request` argument in shared page')
+                        kwargs['request'] = request
+                    await self.connected(request)
+                    await self.header()
+                    result = await func(*args, **kwargs) if is_coroutine(func) else func(*args, **kwargs)
+                    if isinstance(result, types.GeneratorType):
+                        if self.shared:
+                            raise Exception('Yielding for page_ready is not supported on shared pages')
+                        next(result)
+                    if isinstance(result, types.AsyncGeneratorType):
+                        if self.shared:
+                            raise Exception('Yielding for page_ready is not supported on shared pages')
+                        await result.__anext__()
+                    self.page.page_ready_generator = result
+                    await self.footer()
+                return self.page
+            except Exception as e:
+                globals.log.exception(e)
+                return error(500, str(e))
         builder = PageBuilder(decorated, self.shared)
         if globals.state != globals.State.STOPPED:
             builder.create_route(self.route)
@@ -245,22 +246,25 @@ def find_parent_view() -> jp.HTMLBaseComponent:
     return view_stack[-1]
 
 
-def error(status_code: int) -> jp.QuasarPage:
+def error(status_code: int, message: Optional[str] = None) -> Page:
     title = globals.config.title if globals.config else f'Error {status_code}'
     favicon = globals.config.favicon if globals.config else None
     dark = globals.config.dark if globals.config else False
-    wp = jp.QuasarPage(title=title, favicon=favicon, dark=dark, tailwind=True)
+    wp = Page(title=title, favicon=favicon, dark=dark)
     div = jp.Div(a=wp, classes='py-20 text-center')
     jp.Div(a=div, classes='text-8xl py-5', text='☹',
            style='font-family: "Arial Unicode MS", "Times New Roman", Times, serif;')
     jp.Div(a=div, classes='text-6xl py-5', text=status_code)
     if 400 <= status_code <= 499:
-        message = "This page doesn't exist"
+        title = "This page doesn't exist"
     elif 500 <= status_code <= 599:
-        message = 'Server error'
+        title = 'Server error'
     else:
-        message = 'Unknown error'
-    jp.Div(a=div, classes='text-xl py-5', text=message)
+        title = 'Unknown error'
+    if message is not None:
+        title += ':'
+    jp.Div(a=div, classes='text-xl pt-5', text=title)
+    jp.Div(a=div, classes='text-lg pt-2 text-gray-500', text=message or '')
     return wp
 
 

+ 2 - 2
tests/test_pages.py

@@ -176,7 +176,7 @@ def test_shared_page_with_request_parameter_raises_exception(screen: Screen):
         ui.label('Hello, world!')
 
     screen.open('/')
-    screen.should_contain('501')
+    screen.should_contain('500')
     screen.should_contain('Server error')
 
 
@@ -222,5 +222,5 @@ def test_pageready_after_yield_on_shared_page_raises_exception(screen: Screen):
         yield
 
     screen.open('/')
-    screen.should_contain('501')
+    screen.should_contain('500')
     screen.should_contain('Server error')