Spaces:
Running
Running
import streamlit as st | |
import sqlite3 | |
import bcrypt | |
import os | |
# Database file path | |
DB_FILE = "user_auth.db" | |
# Initialize the database | |
def initialize_database(): | |
if not os.path.exists(DB_FILE): | |
conn = sqlite3.connect(DB_FILE) | |
c = conn.cursor() | |
# Create users table | |
c.execute(""" | |
CREATE TABLE users ( | |
username TEXT PRIMARY KEY, | |
password_hash TEXT | |
) | |
""") | |
# Create settings table | |
c.execute(""" | |
CREATE TABLE user_settings ( | |
username TEXT PRIMARY KEY, | |
topic TEXT, | |
instructions TEXT, | |
FOREIGN KEY (username) REFERENCES users (username) | |
) | |
""") | |
conn.commit() | |
conn.close() | |
# Add a new user to the database | |
def add_user(username, password): | |
conn = sqlite3.connect(DB_FILE) | |
c = conn.cursor() | |
password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode() | |
try: | |
c.execute("INSERT INTO users (username, password_hash) VALUES (?, ?)", (username, password_hash)) | |
conn.commit() | |
except sqlite3.IntegrityError: | |
conn.close() | |
return False # Username already exists | |
conn.close() | |
return True | |
# Authenticate a user | |
def authenticate_user(username, password): | |
conn = sqlite3.connect(DB_FILE) | |
c = conn.cursor() | |
c.execute("SELECT password_hash FROM users WHERE username = ?", (username,)) | |
row = c.fetchone() | |
conn.close() | |
if row and bcrypt.checkpw(password.encode(), row[0].encode()): | |
return True | |
return False | |
# Load settings for a user | |
def load_settings(username): | |
conn = sqlite3.connect(DB_FILE) | |
c = conn.cursor() | |
c.execute("SELECT topic, instructions FROM user_settings WHERE username = ?", (username,)) | |
row = c.fetchone() | |
conn.close() | |
if row: | |
return {"topic": row[0], "instructions": row[1]} | |
return {"topic": "", "instructions": ""} | |
# Save settings for a user | |
def save_settings(username, settings): | |
conn = sqlite3.connect(DB_FILE) | |
c = conn.cursor() | |
c.execute(""" | |
INSERT INTO user_settings (username, topic, instructions) | |
VALUES (?, ?, ?) | |
ON CONFLICT(username) | |
DO UPDATE SET topic = excluded.topic, instructions = excluded.instructions | |
""", (username, settings["topic"], settings["instructions"])) | |
conn.commit() | |
conn.close() | |
# Dummy function to simulate prompt generation | |
def generate_prompt(topic, instructions): | |
return f"Generated prompt based on topic '{topic}' and instructions: '{instructions}'." | |
# Initialize the database | |
initialize_database() | |
# Multi-page Streamlit App | |
def main(): | |
# State management | |
if "authenticated" not in st.session_state: | |
st.session_state.authenticated = False | |
st.session_state.username = None | |
def login_page(): | |
st.title("Login") | |
username = st.text_input("Username", key="login_username") | |
password = st.text_input("Password", type="password", key="login_password") | |
if st.button("Login"): | |
if authenticate_user(username, password): | |
st.session_state.authenticated = True | |
st.session_state.username = username | |
else: | |
st.error("Invalid username or password.") | |
st.write("Don't have an account? [Sign Up](#)") | |
def sign_up_page(): | |
st.title("Sign Up") | |
username = st.text_input("Username", key="signup_username") | |
password = st.text_input("Password", type="password", key="signup_password") | |
if st.button("Sign Up"): | |
if add_user(username, password): | |
st.success("Account created successfully. Please login.") | |
else: | |
st.error("Username already exists. Please choose another.") | |
def settings_page(): | |
st.title("Manage Your Settings") | |
username = st.session_state.username | |
settings = load_settings(username) | |
# User-specific settings form | |
topic = st.text_area("Topic", value=settings.get("topic", ""), key="topic") | |
instructions = st.text_area("Custom Instructions", value=settings.get("instructions", ""), key="instructions") | |
if st.button("Save Settings"): | |
settings = {"topic": topic, "instructions": instructions} | |
save_settings(username, settings) | |
st.success("Settings saved successfully!") | |
if st.button("Generate Prompt"): | |
result = generate_prompt(topic, instructions) | |
st.success(result) | |
# Navigation between pages | |
st.sidebar.title("Navigation") | |
page = st.sidebar.radio("Go to", ["Login", "Sign Up", "Settings"]) | |
if page == "Login": | |
login_page() | |
elif page == "Sign Up": | |
sign_up_page() | |
elif page == "Settings": | |
if st.session_state.authenticated: | |
settings_page() | |
else: | |
st.error("You must log in to access this page.") | |
if __name__ == "__main__": | |
main() | |