Example : A standard & complete Dashboard with proper credentials, Login, and multiple .py files in Streamlit Python.
We can implement a standard multi-page Streamlit dashboard using XAMPP MySQL for user authentication in a fully optimized and modular structure is/are -
streamlit_dashboard_project_structure/
│
├── login or app.py <-- Login launcher
├── pages/
│ ├── dashboard.py <-- Main dashboard
│ ├── page1.py <-- Extra pages/forms
│ └── page2.py
│
├── utils/
│ └── auth.py <-- Login check logic
│
├── requirements.txt
Step 1: create and Setup MySQL in XAMPP :
create a database such as 'streamlit_auth' and table 'users' in MySql.
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL
);
--- insert username and password:---
INSERT INTO users (username, password) VALUES ('admin', 'admin123');
Step 2: create utils/auth.py (MySQL Authentication) :
from sqlalchemy import create_engine, text
# MySQL connection (adjust as needed)
engine = create_engine("mysql+pymysql://root:@localhost/streamlit_auth")
def validate_login(username, password):
with engine.connect() as conn:
result = conn.execute(
text("SELECT * FROM users WHERE username = :u AND password = :p"),
{"u": username, "p": password}
)
return result.fetchone() is not None
Step 3: create an app or login.py (Login Page) :
import streamlit as st
from utils.auth import validate_login
st.set_page_config(page_title="Login", layout="centered")
# Session init
if "logged_in" not in st.session_state:
st.session_state.logged_in = False
if "username" not in st.session_state:
st.session_state.username = ""
def login():
st.title("🔐 Login Page")
with st.form("login_form"):
username = st.text_input("Username")
password = st.text_input("Password", type="password")
login_btn = st.form_submit_button("Login")
if login_btn:
if validate_login(username, password):
st.session_state.logged_in = True
st.session_state.username = username
st.success("✅ Login successful")
st.switch_page("pages/dashboard.py")
else:
st.error("❌ Invalid credentials")
if not st.session_state.logged_in:
login()
else:
st.switch_page("pages/dashboard.py")
Step 4: create pages/dashboard.py
import streamlit as st
st.set_page_config(page_title="Dashboard", layout="wide")
if "logged_in" not in st.session_state or not st.session_state.logged_in:
st.warning("You must log in first.")
st.stop()
st.title("📊 Dashboard")
st.write(f"Hello, **{st.session_state.username}**! Welcome to the dashboard.")
st.page_link("pages/page1.py", label="Go to Page 1")
st.page_link("pages/page2.py", label="Go to Page 2")
if st.button("Logout"):
st.session_state.logged_in = False
st.session_state.username = ""
st.switch_page("app.py")
Step 5: create pages/page1.py
import streamlit as st
st.set_page_config(page_title="Page 1")
if "logged_in" not in st.session_state or not st.session_state.logged_in:
st.warning("Login required.")
st.stop()
st.title("📁 Page 1")
st.write(f"Hi, **{st.session_state.username}**. You are on Page 1.")
st.page_link("pages/dashboard.py", label="← Back to Dashboard")
Step 6: create pages/page2.py
import streamlit as st
st.set_page_config(page_title="Page 2")
if "logged_in" not in st.session_state or not st.session_state.logged_in:
st.warning("Login required.")
st.stop()
st.title("📁 Page 2")
st.write(f"Hi, **{st.session_state.username}**. You are on Page 2.")
st.page_link("pages/dashboard.py", label="← Back to Dashboard")
Step 7: requirements.txt
streamlit
sqlalchemy
pymysql
(Install dependencies: pip install -r requirements.txt)
-------------------------------------------------------------
NB:
(i) To run : streamlit run app.py(press enter)
(ii) Here, in the above case we can use default Login as -
Username: admin
Password: admin123
0 Comments