How To Make Flask's Flash Message Appears Only Once After User Is Logged-In!
I have been using Flask to work on a personal website for a couple of days. A small snag got me stumped for a while but I finally figured it out. In Flask, you could use flash to alert signed-in users or visitors about their status on your website such as if they'd logged in or whatever... One drawback of Flask's flash message is that it doesn't go away unless you refresh the browser. Secondly, in the case of an authenticated user, the flash message indicating he'd logged in could appear again and again every time he or she visited the same page.
To solve the problem of Flask's flash message isn't going away, I employed JQuery to make the flash message disappear after nine seconds or so. This is easily done by using JQuery, so I won't go into the detail of how to do this. What I want to talk about is how to make flash messages only appear once after a user is authenticated and logged in.
First, you need to install Flask-Session. Once you got Flask-Session installed, you need to import like so:
from flask_session import Session from flask import session
Before you can use Flask-Session, you need to configure it to work with Flask.
# Flask-Session app.config["SESSION_PERMANENT"] = False app.config["SESSION_TYPE"] = "filesystem" app.config['SESSION_USE_SIGNER'] = True Session(app)
In a login section of your website/web app, you could do something like this after you execute a function or whatever you do to log the user in:
session['user_id'] = current_user.id session['flash_session_page_visit'] = 'page_visit' flash(f'{current_user.name} is logged in!', 'login message')
The session['user_id'] = current_user.id is a Python line of code in which you want to store a user object's property -- that you called from the database -- into a session that you named as user_id. The next trick is to create a new session out of the thin air just for the purpose of using a negation on it later. For this purpose, I created 'page_visit' session which is just a bogus string, and then I stored this inside session's flash_session_page_visit. The next step is to create a session_manager_func() as follows:
def session_manager_func(): if current_user.is_authenticated: if not session.get('user_id): logout_user() else: if not session.get('flash_session_page_visit'): flash(f'User Status: {current_user.name} is logged in!', 'user authentication status')
Now you can use the method session_manager_func() inside any Flask's route to display any flash message just once after a user is logged in. This trick works because you use the negation keyword not to turn flash_session_page_visit into false. Since Flask's session will be true and be available as long the browser isn't closed, then this trick negates this session as if it isn't there at all -- this makes the flash message won't appear twice as long as the browser isn't closed, reopened, and then logged in again.
The current_user is the object got created by Flask-Login package that I imported for my program. Using Flask-Login I'm able to refer to any logged-in user as current_user either inside my Python script or in Flask's Jinja HTML page. This makes me use my time more efficiently since I don't really have to query the database for verifying a logged-in user.
Anywho, if you want to try this, don't forget to implement some sort of Javascript or JQuery to make the flash message goes away for how many seconds you want this to happen, OK? Hopefully, this little trick will be of use to you as it is to me. Thanks for reading.