Show software errors as web page
This commit is contained in:
		
							parent
							
								
									cf652200cd
								
							
						
					
					
						commit
						ba0eccc8d6
					
				
							
								
								
									
										32
									
								
								templates/base.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								templates/base.html
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,32 @@
 | 
			
		|||
<!doctype html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
  <meta charset="utf-8">
 | 
			
		||||
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-gH2yIJqKdNHPEq0n4Mqa/HGKIhSkIHeL5AyhkYV8i59U5AR6csBvApHHNl/vI1Bx" crossorigin="anonymous">
 | 
			
		||||
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
 | 
			
		||||
  <title>
 | 
			
		||||
    {% block title %}{% endblock %}
 | 
			
		||||
  </title>
 | 
			
		||||
 | 
			
		||||
  {% block style %}{% endblock %}
 | 
			
		||||
</head>
 | 
			
		||||
{% from "navbar.html" import navbar with context %}
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
  {% block nav %}{{ navbar() }}{% endblock %}
 | 
			
		||||
 | 
			
		||||
  {% if config.SHOW_BLOCK_ALERT %}
 | 
			
		||||
  <div class="p-2">
 | 
			
		||||
    {{ local_block_alert() }}
 | 
			
		||||
    {{ global_block_alert() }}
 | 
			
		||||
  </div>
 | 
			
		||||
  {% endif %}
 | 
			
		||||
 | 
			
		||||
  {% block content %}{% endblock %}
 | 
			
		||||
 | 
			
		||||
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-A3rJD856KowSb7dwlZdYEkO39Gagi7vIsF0jrRAoQmDKKtQBHUuLZ9AsSv4jD4Xa" crossorigin="anonymous"></script>
 | 
			
		||||
 | 
			
		||||
  {% block script %}{% endblock %}
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										46
									
								
								templates/navbar.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								templates/navbar.html
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
{% macro nav_item(name, label) %}
 | 
			
		||||
<li class="nav-item{% if name == active %} active{% endif %}">
 | 
			
		||||
  <a class="nav-link" href="{{ url_for(name) }}">{{ label }}{% if name == active %} <span class="sr-only">(current)</span>{% endif %}</a>
 | 
			
		||||
</li>
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
{% macro navbar() %}
 | 
			
		||||
<nav class="navbar navbar-expand-lg bg-light">
 | 
			
		||||
  <div class="container-fluid">
 | 
			
		||||
    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarTogglerDemo01" aria-controls="navbarTogglerDemo01" aria-expanded="false" aria-label="Toggle navigation">
 | 
			
		||||
      <span class="navbar-toggler-icon"></span>
 | 
			
		||||
    </button>
 | 
			
		||||
    <div class="collapse navbar-collapse" id="navbarTogglerDemo01">
 | 
			
		||||
      <a class="navbar-brand" href="{{ url_for('index') }}">Dab Mechanic</a>
 | 
			
		||||
      <ul class="navbar-nav me-auto mb-2 mb-lg-0">
 | 
			
		||||
        <li class="nav-item">
 | 
			
		||||
          <a class="nav-link active" aria-current="page" href="#">Home</a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item">
 | 
			
		||||
          <a class="nav-link" href="#">Link</a>
 | 
			
		||||
        </li>
 | 
			
		||||
        <li class="nav-item">
 | 
			
		||||
          <a class="nav-link disabled">Disabled</a>
 | 
			
		||||
        </li>
 | 
			
		||||
      </ul>
 | 
			
		||||
 | 
			
		||||
      <ul class="navbar-nav d-flex">
 | 
			
		||||
        {% if g.user %}
 | 
			
		||||
          <li class="nav-item">
 | 
			
		||||
            <a class="nav-link" href="{{ url_for('user_page', username=g.user) }}">{{ g.user }}</a>
 | 
			
		||||
          </li>
 | 
			
		||||
          <li class="nav-item">
 | 
			
		||||
            <a class="nav-link" href="{{ url_for('oauth_disconnect', next=request.script_root + request.full_path) }}">switch user</a>
 | 
			
		||||
          </li>
 | 
			
		||||
        {% else %}
 | 
			
		||||
          <li class="nav-item">
 | 
			
		||||
            {% set login_url = url_for('start_oauth', next=request.script_root + request.full_path) %}
 | 
			
		||||
            <a class="nav-link" href="{{ login_url }}">connect with Wikidata</a>
 | 
			
		||||
          </li>
 | 
			
		||||
        {% endif %}
 | 
			
		||||
      </ul>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</nav>
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
							
								
								
									
										30
									
								
								templates/show_error.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								templates/show_error.html
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% block style %}
 | 
			
		||||
<link rel="stylesheet" href="{{url_for('static', filename='css/exception.css')}}" />
 | 
			
		||||
{% endblock %}
 | 
			
		||||
 | 
			
		||||
{% block content %}
 | 
			
		||||
<div class="p-2">
 | 
			
		||||
 | 
			
		||||
<h1>Software error: {{ tb.exception_type }}</h1>
 | 
			
		||||
<div>
 | 
			
		||||
  <pre>{{ tb.exception }}</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
{% set body %}
 | 
			
		||||
URL: {{ request.url }}
 | 
			
		||||
 | 
			
		||||
{{ tb.plaintext | safe }}
 | 
			
		||||
{% endset %}
 | 
			
		||||
 | 
			
		||||
<p><a class="btn btn-primary btn-lg" role="button" href="https://github.com/EdwardBetts/dab-mechanic/issues/new?title={{ tb.exception + " " + request.url | urlencode }}&body={{ body | urlencode }}">Submit as an issue on GitHub</a> (requires an account with GitHub)</p>
 | 
			
		||||
 | 
			
		||||
<h2 class="traceback">Traceback <em>(most recent call last)</em></h2>
 | 
			
		||||
{{ tb.render_summary(include_title=False) | safe }}
 | 
			
		||||
 | 
			
		||||
<p>Error in function "{{ last_frame.function_name }}": {{ last_frame_args | pprint }}</p>
 | 
			
		||||
<pre>{{ last_frame.locals | pprint }}</pre>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
{% endblock %}
 | 
			
		||||
							
								
								
									
										19
									
								
								web_view.py
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								web_view.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
#!/usr/bin/python3
 | 
			
		||||
 | 
			
		||||
import inspect
 | 
			
		||||
import json
 | 
			
		||||
import re
 | 
			
		||||
from typing import Any, Iterator, TypedDict
 | 
			
		||||
| 
						 | 
				
			
			@ -7,7 +8,9 @@ from typing import Any, Iterator, TypedDict
 | 
			
		|||
import flask
 | 
			
		||||
import lxml.html
 | 
			
		||||
import requests
 | 
			
		||||
import werkzeug.exceptions
 | 
			
		||||
from requests_oauthlib import OAuth1Session
 | 
			
		||||
from werkzeug.debug.tbtools import get_current_traceback
 | 
			
		||||
from werkzeug.wrappers import Response
 | 
			
		||||
 | 
			
		||||
app = flask.Flask(__name__)
 | 
			
		||||
| 
						 | 
				
			
			@ -17,6 +20,22 @@ app.debug = True
 | 
			
		|||
api_url = "https://en.wikipedia.org/w/api.php"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.errorhandler(werkzeug.exceptions.InternalServerError)
 | 
			
		||||
def exception_handler(e):
 | 
			
		||||
    tb = get_current_traceback()
 | 
			
		||||
    last_frame = next(frame for frame in reversed(tb.frames) if not frame.is_library)
 | 
			
		||||
    last_frame_args = inspect.getargs(last_frame.code)
 | 
			
		||||
    return (
 | 
			
		||||
        flask.render_template(
 | 
			
		||||
            "show_error.html",
 | 
			
		||||
            tb=tb,
 | 
			
		||||
            last_frame=last_frame,
 | 
			
		||||
            last_frame_args=last_frame_args,
 | 
			
		||||
        ),
 | 
			
		||||
        500,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_content(title: str) -> str:
 | 
			
		||||
    """Get article text."""
 | 
			
		||||
    params: dict[str, str | int] = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue