aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/__init__.py2
-rw-r--r--app/config.py4
-rw-r--r--app/forms.py9
-rw-r--r--app/routes.py10
-rw-r--r--app/templates/index.j29
-rw-r--r--app/templates/login.j225
6 files changed, 58 insertions, 1 deletions
diff --git a/app/__init__.py b/app/__init__.py
index 96c8ef5..7b0c03d 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -1,5 +1,7 @@
from flask import Flask
+from app.config import Config
app = Flask(__name__)
+app.config.from_object(Config)
from app import routes
diff --git a/app/config.py b/app/config.py
new file mode 100644
index 0000000..aeb2840
--- /dev/null
+++ b/app/config.py
@@ -0,0 +1,4 @@
+from os import environ
+
+class Config:
+ SECRET_KEY = environ.get("SECRET_KEY") or "you-will-never-guess" \ No newline at end of file
diff --git a/app/forms.py b/app/forms.py
new file mode 100644
index 0000000..504824a
--- /dev/null
+++ b/app/forms.py
@@ -0,0 +1,9 @@
+from flask_wtf import FlaskForm
+from wtforms.validators import DataRequired
+from wtforms import StringField, PasswordField, BooleanField, SubmitField
+
+class LoginForm(FlaskForm):
+ username = StringField("Username", validators=[DataRequired()])
+ password = PasswordField("Password", validators=[DataRequired()])
+ remember_me = BooleanField("Remember Me")
+ submit = SubmitField("Sign In") \ No newline at end of file
diff --git a/app/routes.py b/app/routes.py
index c18d93b..b943e16 100644
--- a/app/routes.py
+++ b/app/routes.py
@@ -1,6 +1,7 @@
from app import app
+from app.forms import LoginForm
from app.controller import RoundGenerator
-from flask import render_template, request, url_for, Response
+from flask import render_template, request, url_for, Response, flash, redirect
rg = RoundGenerator()
@@ -8,6 +9,13 @@ rg = RoundGenerator()
def home():
return render_template("index.j2", url_for=url_for)
+@app.route("/login", methods=["GET", "POST"])
+def login():
+ form = LoginForm()
+ if form.validate_on_submit():
+ flash(f"User {form.username} is requesting to login.")
+ return redirect("/")
+ return render_template("login.j2", form=form)
@app.route("/control", methods=["GET"])
def get_controls():
diff --git a/app/templates/index.j2 b/app/templates/index.j2
index ce0d531..656b187 100644
--- a/app/templates/index.j2
+++ b/app/templates/index.j2
@@ -7,6 +7,15 @@
{{ navbar(url_for) }}
<div hx-post="/clear" hx-swap="outerHTML" hx-trigger="load"></div>
<div hx-get="/control" hx-swap="outerHTML" hx-trigger="load"></div>
+ {% with messages = get_flashed_messages() %}
+ {% if messages %}
+ <ul>
+ {% for message in messages %}
+ <li>{{ message }}</li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ {% endwith %}
{{ footer() }}
</section>
</body>
diff --git a/app/templates/login.j2 b/app/templates/login.j2
new file mode 100644
index 0000000..fe898cb
--- /dev/null
+++ b/app/templates/login.j2
@@ -0,0 +1,25 @@
+{% from "macros.j2" import header, footer, navbar %}
+<!doctype html>
+<html lang="en">
+ {{ header(url_for) }}
+ <body>
+ <section class="section">
+ {{ navbar(url_for) }}
+ <h1>Sign In</h1>
+ <form action="" method="post" novalidate>
+ {{ form.hidden_tag() }}
+ <p>
+ {{ form.username.label }}<br>
+ {{ form.username(size=32) }}
+ </p>
+ <p>
+ {{ form.password.label }}<br>
+ {{ form.password(size=32) }}
+ </p>
+ <p>{{ form.remember_me() }} {{ form.remember_me.label }}</p>
+ <p>{{ form.submit() }}</p>
+ </form>
+ {{ footer() }}
+ </section>
+ </body>
+</html>