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