Updating Bootstrap; refactoring dir structure, Pep 8 import cleanup
This commit is contained in:
parent
333f4fe8c0
commit
e09a702896
BIN
images/pic1.png
BIN
images/pic1.png
Binary file not shown.
Before Width: | Height: | Size: 412 KiB After Width: | Height: | Size: 416 KiB |
|
@ -4,17 +4,21 @@ import os
|
|||
|
||||
# Lib imports
|
||||
from flask import Flask
|
||||
#OIDC Login path
|
||||
# OIDC Login path
|
||||
from flask_oidc import OpenIDConnect
|
||||
# Flask Login Path
|
||||
from flask_bcrypt import Bcrypt
|
||||
from flask_login import current_user, login_user, logout_user, LoginManager
|
||||
|
||||
from flask_login import current_user
|
||||
from flask_login import login_user
|
||||
from flask_login import logout_user
|
||||
from flask_login import LoginManager
|
||||
|
||||
# Apoplication imports
|
||||
from core.utils import Logger
|
||||
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_object("core.config.Config")
|
||||
|
||||
|
@ -23,6 +27,7 @@ login_manager = LoginManager(app)
|
|||
bcrypt = Bcrypt(app)
|
||||
logger = Logger().get_logger()
|
||||
|
||||
|
||||
def oidc_loggedin():
|
||||
return oidc.user_loggedin
|
||||
|
||||
|
@ -33,15 +38,19 @@ def oidc_isAdmin():
|
|||
return True
|
||||
return False
|
||||
|
||||
|
||||
app.jinja_env.globals['oidc_loggedin'] = oidc_loggedin
|
||||
app.jinja_env.globals['oidc_isAdmin'] = oidc_isAdmin
|
||||
app.jinja_env.globals['TITLE'] = app.config["TITLE"]
|
||||
|
||||
|
||||
from core.models import db, User
|
||||
from core.models import db
|
||||
from core.models import User
|
||||
|
||||
db.init_app(app)
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
|
||||
from core.forms import RegisterForm, LoginForm
|
||||
from core.forms import RegisterForm
|
||||
from core.forms import LoginForm
|
||||
from core import routes
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
{
|
||||
"web": {
|
||||
"auth_uri": "http://localhost:8080/auth/realms/apps/protocol/openid-connect/auth",
|
||||
"auth_uri": "https://www.ssoapps.com/auth/realms/apps/protocol/openid-connect/auth",
|
||||
"client_id": "apps",
|
||||
"issuer": "http://localhost:8080/auth/realms/apps",
|
||||
"issuer": "https://www.ssoapps.com/auth/realms/apps",
|
||||
"client_secret": "[ADD YOUR SECRET FROM THE REALM>CLIENTS>apps>Credentials Tab]",
|
||||
"redirect_uris": [
|
||||
"http://localhost:6969/"
|
||||
"https%3A%2F%2Fwww.your-domain-here.com%2F"
|
||||
],
|
||||
"userinfo_uri": "http://localhost:8080/auth/realms/apps/protocol/openid-connect/userinfo",
|
||||
"token_uri": "http://localhost:8080/auth/realms/apps/protocol/openid-connect/token",
|
||||
"token_introspection_uri": "http://localhost:8080/auth/realms/apps/protocol/openid-connect/token/introspect"
|
||||
"userinfo_uri": "https://www.ssoapps.com/auth/realms/apps/protocol/openid-connect/userinfo",
|
||||
"token_uri": "https://www.ssoapps.com/auth/realms/apps/protocol/openid-connect/token",
|
||||
"token_introspection_uri": "https://www.ssoapps.com/auth/realms/apps/protocol/openid-connect/token/introspect"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,15 @@
|
|||
# System import
|
||||
import os, secrets, json
|
||||
# Python imports
|
||||
import os
|
||||
import secrets
|
||||
import json
|
||||
from datetime import timedelta
|
||||
|
||||
|
||||
# Lib imports
|
||||
|
||||
|
||||
# Apoplication imports
|
||||
|
||||
|
||||
|
||||
APP_NAME = ':::APP TITLE:::'
|
||||
ROOT_FILE_PTH = os.path.dirname(os.path.realpath(__file__))
|
||||
# This path is submitted as the redirect URI in certain code flows.
|
||||
|
@ -35,6 +36,8 @@ class Config(object):
|
|||
SQLALCHEMY_DATABASE_URI = "sqlite:///static/db/database.db"
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
|
||||
REGISTER_DISABLED = False
|
||||
LOGIN_DISABLED = False
|
||||
LOGIN_PATH = "FLASK_LOGIN" # Value can be OIDC or FLASK_LOGIN
|
||||
OIDC_TOKEN_TYPE_HINT = 'access_token'
|
||||
APP_REDIRECT_URI = REDIRECT_LINK
|
||||
|
|
|
@ -1,9 +1,23 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask_wtf import FlaskForm
|
||||
from wtforms import StringField, PasswordField, SubmitField
|
||||
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError
|
||||
|
||||
from wtforms import StringField
|
||||
from wtforms import PasswordField
|
||||
from wtforms import SubmitField
|
||||
|
||||
from wtforms.validators import DataRequired
|
||||
from wtforms.validators import Length
|
||||
from wtforms.validators import Email
|
||||
from wtforms.validators import EqualTo
|
||||
from wtforms.validators import ValidationError
|
||||
|
||||
# Apoplication imports
|
||||
from core import User
|
||||
|
||||
|
||||
|
||||
class RegisterForm(FlaskForm):
|
||||
username = StringField('Username', validators=[DataRequired(), Length(min=4, max=24)])
|
||||
email = StringField('Email', validators=[DataRequired(), Email()])
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
# Python imports
|
||||
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
from core import app, login_manager
|
||||
# Lib imports
|
||||
from flask_login import UserMixin
|
||||
from flask_sqlalchemy import SQLAlchemy
|
||||
|
||||
# Apoplication imports
|
||||
from core import app, login_manager
|
||||
|
||||
|
||||
|
||||
db = SQLAlchemy(app)
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
from . import Routes
|
||||
from .pages import Flask_Login
|
||||
from .pages import Flask_Register
|
||||
from .pages import OIDC_Login
|
||||
from .pages import OIDC_Register
|
||||
from .pages import LoginManager
|
||||
"""
|
||||
Routes module
|
||||
"""
|
||||
from .login_controller import flask_login
|
||||
from .login_controller import flask_register
|
||||
from .login_controller import oidc_login
|
||||
from .login_controller import oidc_register
|
||||
from .login_controller import controller
|
||||
|
||||
from . import routes
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
"""
|
||||
Login module
|
||||
"""
|
|
@ -1,12 +1,15 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask import redirect, url_for, flash
|
||||
from flask import redirect
|
||||
from flask import url_for
|
||||
from flask import flash
|
||||
|
||||
# App imports
|
||||
# Application imports
|
||||
from core import app
|
||||
|
||||
|
||||
|
||||
ROUTE = app.config['LOGIN_PATH']
|
||||
|
||||
|
|
@ -1,19 +1,32 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask import request, render_template, flash, redirect, url_for
|
||||
from flask_login import current_user, login_user, logout_user
|
||||
from flask import flash
|
||||
from flask import redirect
|
||||
from flask import request
|
||||
from flask import render_template
|
||||
from flask import url_for
|
||||
|
||||
from flask_login import current_user
|
||||
from flask_login import login_user
|
||||
from flask_login import logout_user
|
||||
|
||||
# Application imports
|
||||
from core import app
|
||||
from core import bcrypt
|
||||
from core import db
|
||||
from core import User
|
||||
from core import LoginForm
|
||||
|
||||
# App imports
|
||||
from core import app, bcrypt, db, User, LoginForm
|
||||
from core.utils import MessageHandler # Get simple message processor
|
||||
|
||||
|
||||
|
||||
msgHandler = MessageHandler()
|
||||
|
||||
@app.route('/app-login', methods=['GET', 'POST'])
|
||||
def app_login():
|
||||
if current_user.is_authenticated:
|
||||
if current_user.is_authenticated or app.config["LOGIN_DISABLED"]:
|
||||
return redirect(url_for("home"))
|
||||
|
||||
_form = LoginForm()
|
|
@ -1,20 +1,31 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask import request, render_template, url_for, redirect, flash
|
||||
from flask import flash
|
||||
from flask import redirect
|
||||
from flask import request
|
||||
from flask import render_template
|
||||
from flask import url_for
|
||||
|
||||
# Application imports
|
||||
# Get from __init__
|
||||
from core import app
|
||||
from core import bcrypt
|
||||
from core import db
|
||||
from core import current_user
|
||||
from core import RegisterForm
|
||||
|
||||
# App imports
|
||||
from core import app, bcrypt, db, current_user, RegisterForm # Get from __init__
|
||||
from core.models import User
|
||||
from core.utils import MessageHandler # Get simple message processor
|
||||
|
||||
|
||||
|
||||
msgHandler = MessageHandler()
|
||||
|
||||
|
||||
@app.route('/app-register', methods=['GET', 'POST'])
|
||||
def app_register():
|
||||
if current_user.is_authenticated:
|
||||
if current_user.is_authenticated or app.config["REGISTER_DISABLED"]:
|
||||
return redirect(url_for("home"))
|
||||
|
||||
_form = RegisterForm()
|
|
@ -1,13 +1,15 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask import request, redirect, flash
|
||||
from flask import request
|
||||
from flask import redirect
|
||||
from flask import flash
|
||||
|
||||
|
||||
# App imports
|
||||
# Application imports
|
||||
from ... import app, oidc
|
||||
|
||||
|
||||
|
||||
@app.route('/oidc-login', methods=['GET', 'POST'])
|
||||
@oidc.require_login
|
||||
def oidc_login():
|
|
@ -1,19 +1,28 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask import request, render_template, url_for, redirect, flash
|
||||
from flask import flash
|
||||
from flask import redirect
|
||||
from flask import request
|
||||
from flask import render_template
|
||||
from flask import url_for
|
||||
|
||||
# Application imports
|
||||
# Get from __init__
|
||||
from ... import app
|
||||
from ... import oidc
|
||||
from ... import db
|
||||
|
||||
# App imports
|
||||
from ... import app, oidc, db # Get from __init__
|
||||
from ...utils import MessageHandler # Get simple message processor
|
||||
|
||||
|
||||
|
||||
msgHandler = MessageHandler()
|
||||
|
||||
|
||||
@app.route('/oidc-register', methods=['GET', 'POST'])
|
||||
def oidc_register():
|
||||
if oidc.user_loggedin:
|
||||
if oidc.user_loggedin or app.config["REGISTER_DISABLED"]:
|
||||
return redirect("/home")
|
||||
|
||||
_form = RegisterForm()
|
|
@ -1,15 +1,21 @@
|
|||
# Python imports
|
||||
|
||||
# Lib imports
|
||||
from flask import request, render_template
|
||||
from flask import request
|
||||
from flask import render_template
|
||||
from flask_login import current_user
|
||||
|
||||
# Application imports
|
||||
# Get from __init__
|
||||
from core import app
|
||||
from core import logger
|
||||
from core import oidc
|
||||
from core import db
|
||||
|
||||
# App imports
|
||||
from core import app, logger, oidc, db # Get from __init__
|
||||
from core.utils import MessageHandler # Get simple message processor
|
||||
|
||||
|
||||
|
||||
msgHandler = MessageHandler()
|
||||
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -25,12 +25,8 @@
|
|||
|
||||
{% block header_css %}
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.png') }}">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap5/bootstrap.min.css')}}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap5/bootstrap-dark.min.css')}}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap-icons/bootstrap-icons.css')}}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/libs/bootstrap5/bootstrap.min.css')}}">
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/libs/bootstrap-icons/bootstrap-icons.css')}}">
|
||||
|
||||
<!-- Site CSS -->
|
||||
<link rel="stylesheet" href="{{ url_for('static', filename='css/main.css')}}">
|
||||
|
@ -47,7 +43,7 @@
|
|||
{% endblock %}
|
||||
</head>
|
||||
{% endblock %}
|
||||
<body>
|
||||
<body data-bs-theme="dark">
|
||||
<video id="bg" src="{{ url_for('static', filename='imgs/backgrounds/particles.mp4')}}"
|
||||
poster="{{ url_for('static', filename='imgs/backgrounds/background.png')}}"
|
||||
autoplay loop>
|
||||
|
@ -111,9 +107,9 @@
|
|||
<script src="{{ url_for('static', filename='js/libs/bootstrap5/bootstrap.bundle.min.js')}}"></script>
|
||||
|
||||
<!-- For React -->
|
||||
<script src="{{ url_for('static', filename='js/libs/babel.min.js')}}"></script>
|
||||
<script src="{{ url_for('static', filename='js/libs/react/react.production.min.js')}}"></script>
|
||||
<script src="{{ url_for('static', filename='js/libs/react/react-dom.production.min.js')}}"></script>
|
||||
<script src="{{ url_for('static', filename='js/libs/babel.min.js')}}"></script>
|
||||
|
||||
<!-- Application Imports -->
|
||||
{% block body_scripts_additional %}
|
||||
|
|
|
@ -16,8 +16,7 @@
|
|||
{% block body_content_additional %}
|
||||
<div class="row">
|
||||
<div class="col justify-content-center text-center">
|
||||
<p>Using Bootstrap 5 Themeing...</p>
|
||||
<p>Themes: <a href="https://bootswatch.com/" target="_blank">Bootswatch</a></p>
|
||||
<p>Using Bootstrap 5 Themeing with Dark Mode defaulted...</p>
|
||||
<p>With React available...</p>
|
||||
<p>A React Example Page:
|
||||
<a href="{{ url_for('react_page') }}">
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
# Python imports
|
||||
import os, logging
|
||||
import os
|
||||
import logging
|
||||
|
||||
# Lib imports
|
||||
|
||||
# Apoplication imports
|
||||
|
||||
# Application imports
|
||||
|
||||
|
||||
class Logger:
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
# Gtk imports
|
||||
|
||||
# Python imports
|
||||
|
||||
# Application imports
|
||||
# Lib imports
|
||||
|
||||
# Apoplication imports
|
||||
|
||||
|
||||
|
||||
class MessageHandler:
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
function main() {
|
||||
SCRIPTPATH="$( cd "$(dirname "")" >/dev/null 2>&1 ; pwd -P )"
|
||||
echo "Working Dir: " $(pwd)
|
||||
source "../venv/bin/activate"
|
||||
# source "../venv/bin/activate"
|
||||
|
||||
LOG_LEVEL=debug
|
||||
WORKER_COUNT=1
|
||||
|
@ -20,7 +20,7 @@ function main() {
|
|||
# Note: NEED -k eventlet for this to work! I spent too many hours on this...
|
||||
# <module>:<app> IE <file>:<flask app variable>
|
||||
gunicorn wsgi:app -p app.pid -b $ADDR:$PORT \
|
||||
-k eventlet \
|
||||
# -k eventlet \
|
||||
-w $WORKER_COUNT \
|
||||
--timeout $TIMEOUT \
|
||||
--log-level $LOG_LEVEL
|
||||
|
|
Loading…
Reference in New Issue