From c7da7e32b71f345f6786decae4d0d52be547ff11 Mon Sep 17 00:00:00 2001 From: DarkCat09 Date: Wed, 15 Feb 2023 17:34:49 +0400 Subject: [PATCH] Added simple web page, routes are in a separate file --- flaskapp/app.py | 20 +++++++++++------- flaskapp/errors.py | 48 ++++++++++++++++++++++++++++++++++++++++++++ flaskapp/routes.py | 16 +++++++++++++++ static/css/style.css | 31 ++++++++++++++++++++++++++++ static/js/script.js | 4 ++++ templates/404.html | 11 ++++++++++ templates/500.html | 15 ++++++++++++++ templates/base.html | 18 +++++++++++++++++ templates/index.html | 12 +++++++++++ 9 files changed, 168 insertions(+), 7 deletions(-) create mode 100644 flaskapp/errors.py create mode 100644 flaskapp/routes.py create mode 100644 static/css/style.css create mode 100644 static/js/script.js create mode 100644 templates/404.html create mode 100644 templates/500.html create mode 100644 templates/base.html create mode 100644 templates/index.html diff --git a/flaskapp/app.py b/flaskapp/app.py index ca9d819..31a7105 100644 --- a/flaskapp/app.py +++ b/flaskapp/app.py @@ -2,32 +2,38 @@ import os import secrets -from pathlib import Path from flask import Flask +from . import routes +from . import errors + def create_app() -> Flask: """Flask app factory function""" - root = Path('..') - static = str(root / 'static') - tmpl = str(root / 'templates') - + # Create an app object app = Flask( __name__, - static_folder=static, - template_folder=tmpl, + static_folder='../static', + template_folder='../templates', instance_relative_config=True, ) + # Get the token from environment + # or generate it using secrets app.config['SECRET_KEY'] = os.getenv( 'SECRET_KEY', secrets.token_hex(32), ) + # Create instance/ directory try: os.makedirs(app.instance_path) except OSError: pass + # Add routes + routes.add_routes(app) + errors.add_routes(app) + return app diff --git a/flaskapp/errors.py b/flaskapp/errors.py new file mode 100644 index 0000000..d0382d6 --- /dev/null +++ b/flaskapp/errors.py @@ -0,0 +1,48 @@ +"""Flask app error handlers""" + +from pathlib import Path + +from flask import Flask +from flask import render_template + +# Add other HTTP error codes here +CODES = [404, 500] + + +def add_routes(app: Flask) -> None: + """Add all error handlers + + Args: + app (Flask): Flask application + """ + + tmpl_dir = app.template_folder + if tmpl_dir is None: + return + + tmpl = Path(__file__).parent / tmpl_dir + + for code in CODES: + add_handler(app, tmpl, code) + + +def add_handler( + app: Flask, + tmpl: Path, + code: int) -> None: + """Add Flask app error handler. + Only for internal use + + Args: + app (Flask): Flask application + file (str): Template filename + code (int): Error code + """ + + file = f'{code}.html' + + if (tmpl / file).exists(): + + @app.errorhandler(code) + def handler(_e): + return render_template(file), code diff --git a/flaskapp/routes.py b/flaskapp/routes.py new file mode 100644 index 0000000..785b5dd --- /dev/null +++ b/flaskapp/routes.py @@ -0,0 +1,16 @@ +"""Main Flask app routes""" + +from flask import Flask +from flask import render_template + + +def add_routes(app: Flask) -> None: + """Add main routes + + Args: + app (Flask): Flask application + """ + + @app.route('/') + def index(): + return render_template('index.html') diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..0d629db --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,31 @@ +body { + height: 100vh; + padding: 0; + margin: 0; + font-family: sans-serif; + + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + + background: #fff; + color: #000; +} + +@media (prefers-color-scheme: dark) { + body { + background: #202023; + color: #eee; + } +} + +header { margin-top: 5px; } +footer { margin-bottom: 5px; } + +a { + color: #5b8a55; +} +a:hover { + filter: brightness(120%); +} diff --git a/static/js/script.js b/static/js/script.js new file mode 100644 index 0000000..65e1260 --- /dev/null +++ b/static/js/script.js @@ -0,0 +1,4 @@ +addEventListener('load', () => { + document.getElementById('js') + .innerText = new Date().toLocaleString() +}) diff --git a/templates/404.html b/templates/404.html new file mode 100644 index 0000000..3faabe7 --- /dev/null +++ b/templates/404.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block title %}404{% endblock %} + +{% block content %} +

404: Not Found

+

+ Go to the + main page +

+{% endblock %} diff --git a/templates/500.html b/templates/500.html new file mode 100644 index 0000000..2835a07 --- /dev/null +++ b/templates/500.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block title %}500{% endblock %} + +{% block content %} +

500: ISE

+

+ An error occured while + processing your request. +

+

+ Please, try again later + or contact web site admin. +

+{% endblock %} diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..aa55818 --- /dev/null +++ b/templates/base.html @@ -0,0 +1,18 @@ + + + + + + + {% block title %}{% endblock %} | ${REPO_NAME} + + + + +
${REPO_NAME}
+
+ {% block content %}{% endblock %} +
+ + + diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..a6c7f3b --- /dev/null +++ b/templates/index.html @@ -0,0 +1,12 @@ +{% extends "base.html" %} + +{% block title %}Main page{% endblock %} + +{% block content %} +

+ This is the default main page of + + Flask app template + +

+{% endblock %}