Login required

This commit is contained in:
2023-06-05 00:52:14 +02:00
parent ddd1ae7c5b
commit fba919de8c
9 changed files with 116 additions and 13 deletions

Binary file not shown.

View File

@@ -15,17 +15,24 @@ login_manager = LoginManager()
@login_manager.user_loader
def load_user(user_id):
return User.get(int(user_id))
return User.query.get(int(user_id))
def make_shell_context():
return {"db": db, "User": User}
def create_app():
# db.create_all()
app = Flask(__name__)
bootstrap.init_app(app)
# app.register_blueprint(results)
app.config.from_object(Config)
db.init_app(app)
login_manager.init_app(app)
login_manager.login_view = "login"
login_manager.login_view = "main.login"
app.jinja_env.auto_reload = True
app.register_blueprint(main)
app.shell_context_processor(make_shell_context)
with app.app_context():
db.create_all()
return app

View File

@@ -10,3 +10,8 @@ class Config(object):
FRAMEWORK = os.environ.get("FRAMEWORK") or FRAMEWORKS[0]
OUTPUT = os.environ.get("OUTPUT") or "local" # local or docker
TEMPLATES_AUTO_RELOAD = True
SECRET_KEY = os.environ.get("SECRET_KEY") or "really-hard-to-guess-key"
SQLALCHEMY_DATABASE_URI = os.environ.get(
"DATABASE_URL"
) or "sqlite:///" + os.path.join(basedir, "app.db")
SQLALCHEMY_TRACK_MODIFICATIONS = False

View File

@@ -0,0 +1,22 @@
from flask_wtf import FlaskForm
from wtforms import (
StringField,
PasswordField,
BooleanField,
SubmitField,
)
from wtforms.validators import (
DataRequired,
Length,
)
class LoginForm(FlaskForm):
username = StringField(
"Username", validators=[DataRequired(), Length(1, 20)]
)
password = PasswordField(
"Password", validators=[DataRequired(), Length(4, 150)]
)
remember_me = BooleanField("Remember me")
submit = SubmitField()

View File

@@ -1,7 +1,20 @@
import os
from flask import Blueprint, current_app, render_template, url_for
from flask import (
Blueprint,
current_app,
render_template,
url_for,
flash,
redirect,
request,
abort,
)
from flask_login import login_user, current_user, logout_user, login_required
from werkzeug.urls import url_parse
from benchmark.Utils import Files, Folders
from .forms import LoginForm
from benchmark.ResultsBase import StubReport
from .models import User
main = Blueprint("main", __name__)
@@ -34,20 +47,43 @@ def index():
@main.route("/results")
@login_required
def results():
pass
return render_template("results.html")
@main.route("/datasets")
@login_required
def datasets():
pass
@main.route("/config")
@login_required
def config():
pass
@main.route("/login")
@main.route("/login", methods=["GET", "POST"])
def login():
return render_template("login.html")
if current_user.is_authenticated:
return redirect(url_for("main.index"))
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.username.data).first()
if user is None or not user.check_password(form.password.data):
flash("Invalid username or password")
return redirect(url_for("main.login"))
login_user(user, remember=form.remember_me.data)
flash("Logged in successfully.")
next_page = request.args.get("next")
if not next_page or url_parse(next_page).netloc != "":
next_page = url_for("main.index")
return redirect(next_page)
return render_template("login.html", title="Sign In", form=form)
@main.route("/logout")
def logout():
logout_user()
return redirect(url_for("main.index"))

View File

@@ -1,6 +1,8 @@
from hashlib import md5
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, String
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
db = SQLAlchemy()
@@ -8,7 +10,20 @@ db = SQLAlchemy()
class User(UserMixin, db.Model):
id = Column(Integer, primary_key=True)
username = Column(String(64), index=True, unique=True)
email = Column(String(120), index=True, unique=True)
password_hash = Column(String(128))
def __repr__(self):
return "<User {}>".format(self.username)
return "<User {} {}>".format(self.username, self.email)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
def avatar(self, size):
digest = md5(self.email.lower().encode("utf-8")).hexdigest()
return "https://www.gravatar.com/avatar/{}?d=identicon&s={}".format(
digest, size
)

View File

@@ -5,13 +5,20 @@
<meta charset="utf-8">
<meta name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% block styles %}
<!-- Bootstrap CSS -->
{{ bootstrap.load_css() }}
{% endblock %}
{% block styles %}{{ bootstrap.load_css() }}{% endblock %}
<title>Benchmark</title>
{% endblock %}
</head>
<body>{% include "_nav.html" %}</body>
<body>
{% include "_nav.html" %}
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}<div class="alert alert-info" role="alert">{{ message }}</div>{% endfor %}
{% endif %}
{% endwith %}
<div class="container">
{% block content %}{% endblock %}
</div>
</body>
{% block jscript %}{{ bootstrap.load_js() }}{% endblock %}
</html>

View File

@@ -0,0 +1,6 @@
{% extends 'base.html' %}
{% from 'bootstrap5/form.html' import render_form %}
{% block content %}
<h2>Login</h2>
{{ render_form(form) }}
{% endblock content %}

View File

@@ -0,0 +1,5 @@
{% extends "base.html" %}
{% block content %}
<h1>Home</h1>
<p>Welcome to the home page!</p>
{% endblock content %}