61 lines
1.6 KiB
Python
61 lines
1.6 KiB
Python
|
import os
|
||
|
from typing import Union
|
||
|
|
||
|
from flask import (Flask, flash, redirect, render_template, request,
|
||
|
send_from_directory, url_for)
|
||
|
from flask_login import LoginManager, login_required, login_user, logout_user
|
||
|
|
||
|
from forms import LoginForm
|
||
|
from lotosa import LoToSa
|
||
|
from user import User
|
||
|
|
||
|
app = Flask(__name__)
|
||
|
app.config.update(
|
||
|
SECRET_KEY=os.urandom(32),
|
||
|
SESSION_COOKIE_HTTPONLY=True,
|
||
|
REMEMBER_COOKIE_HTTPONLY=True,
|
||
|
SESSION_COOKIE_SAMESITE="Strict",
|
||
|
)
|
||
|
login_manager = LoginManager()
|
||
|
login_manager.init_app(app)
|
||
|
|
||
|
lotosa = LoToSa(app)
|
||
|
|
||
|
|
||
|
@login_manager.user_loader
|
||
|
def load_user(user_id) -> Union[User, None]:
|
||
|
for user in lotosa.get_users():
|
||
|
if user.uid == user_id:
|
||
|
return user
|
||
|
return None
|
||
|
|
||
|
|
||
|
@app.route('/', methods=['GET', 'POST'])
|
||
|
def index():
|
||
|
i18n = lotosa.get_i18n(request)
|
||
|
form = LoginForm()
|
||
|
if request.method == 'POST':
|
||
|
username = form.username.data
|
||
|
password = form.password.data
|
||
|
user = lotosa.login_user(username, password)
|
||
|
if user:
|
||
|
login_user(user)
|
||
|
flash('Logged in successfully.')
|
||
|
return redirect(url_for('admin'))
|
||
|
flash('Logged in faled, please try again.')
|
||
|
return render_template('index.html', i18n=i18n, form=form)
|
||
|
|
||
|
|
||
|
@app.route('/admin', methods=['GET'])
|
||
|
@login_required
|
||
|
def admin():
|
||
|
i18n = lotosa.get_i18n(request)
|
||
|
return render_template('admin.html', i18n=i18n)
|
||
|
|
||
|
|
||
|
@app.route('/favicon.ico')
|
||
|
def favicon():
|
||
|
return send_from_directory(os.path.join(app.root_path, 'static'),
|
||
|
'favicon.ico',
|
||
|
mimetype='image/vnd.microsoft.icon')
|