I am trying to create an admin dashboard to manage my webpage using both flask & flask-login. I would like to find the current users username using flask-login so that I can authenticate the user before allowing them to access the admin dashboard.
Here is my current code for app.py
from flask import Flask, render_template, request, redirect
from flask_login import login_required, current_user, login_user, logout_user
from models import UserModel, db, login
app = Flask(__name__,static_url_path='',static_folder='static')
app.secret_key = 'xyz'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
login.init_app(app)
login.login_view = 'login'
@app.route('/admin')
@login_required
def admin_dashboard():
return render_template('admin.html')
@app.before_first_request
def create_all():
db.create_all()
@app.route('/legal')
@app.route('/legal/')
def legal():
return render_template('legal.html')
@app.route('/legal/tos')
@app.route('/legal/tos/')
def tos():
return render_template('tos.html')
@app.route('/legal/privacy-policy')
@app.route('/legal/privacy-policy/')
def priv_policy():
return render_template('privacy-policy.html')
@app.route('/')
def main():
return render_template('index.html')
@app.route('/dashboard')
@login_required
def dashboard():
return render_template('dashboard.html')
# @app.before_request
# def log_request_info():
# app.logger.debug('Headers: %s', request.headers)
# app.logger.debug('Body: %s', request.get_data())
@app.route('/portal', methods=['POST', 'GET'])
def login():
if current_user.is_authenticated:
return redirect('/dashboard')
if request.method == 'POST':
email = request.form['email']
user = UserModel.query.filter_by(email=email).first()
if user is not None and user.check_password(request.form['password']):
login_user(user)
return redirect('/dashboard')
return render_template('login.html')
@app.route('/register', methods=['POST', 'GET'])
def register():
if current_user.is_authenticated:
return redirect('/dashboard')
if request.method == 'POST':
email = request.form['email']
username = request.form['username']
password = request.form['password']
if UserModel.query.filter_by(email=email).first():
return ('Failure.')
user = UserModel(email=email, username=username)
user.set_password(password)
db.session.add(user)
db.session.commit()
return redirect('/portal')
return render_template('register.html')
@app.route('/logout')
def logout():
logout_user()
return redirect('/dashboard')
if __name__ == "__main__":
app.run(debug=True)
Here is my model.py code.
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from flask_login import LoginManager
login = LoginManager()
db = SQLAlchemy()
class UserModel(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(80), unique=True)
username = db.Column(db.String(100))
password_hash = db.Column(db.String())
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)
@login.user_loader
def load_user(id):
return UserModel.query.get(int(id))
Any help would be greatly appreciated!