mirror of
https://github.com/Doctorado-ML/benchmark.git
synced 2025-08-16 07:55:54 +00:00
Login required
This commit is contained in:
BIN
benchmark/scripts/flask_app/app.db
Normal file
BIN
benchmark/scripts/flask_app/app.db
Normal file
Binary file not shown.
@@ -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
|
||||
|
@@ -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
|
||||
|
22
benchmark/scripts/flask_app/forms.py
Normal file
22
benchmark/scripts/flask_app/forms.py
Normal 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()
|
@@ -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"))
|
||||
|
@@ -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
|
||||
)
|
||||
|
@@ -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>
|
||||
|
6
benchmark/scripts/flask_app/templates/login.html
Normal file
6
benchmark/scripts/flask_app/templates/login.html
Normal 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 %}
|
5
benchmark/scripts/flask_app/templates/results.html
Normal file
5
benchmark/scripts/flask_app/templates/results.html
Normal file
@@ -0,0 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
<h1>Home</h1>
|
||||
<p>Welcome to the home page!</p>
|
||||
{% endblock content %}
|
Reference in New Issue
Block a user