鱼C论坛

 找回密码
 立即注册
查看: 947|回复: 3

streamlit 和mysql数据库的问题

[复制链接]
发表于 2024-6-25 16:01:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 caeser 于 2024-6-25 16:01 编辑
  1. import streamlit as st
  2. import mysql.connector
  3. from mysql.connector import Error
  4. import streamlit_antd_components as sac


  5. db_config = {
  6.     'host': 'localhost',
  7.     'user': 'root',
  8.     'password': '791120',
  9.     'database': 'familyfinance'
  10.     #'raise_on_warnings': True
  11. }

  12. # CSS样式,用于隐藏Streamlit的默认导航菜单、页脚和页眉
  13. hide_st_style = """
  14.         <style>
  15.         #MainMenu {visibility: hidden;}
  16.         footer {visibility: hidden;}
  17.         header {visibility: hidden;}
  18.         #root > div:nth-child(1) > div > div > div > div > section > div {padding-top: 0rem;}
  19.         </style>
  20.         """
  21. st.markdown(hide_st_style, unsafe_allow_html=True)# 应用CSS样式

  22. def authenticate_user(username, password):
  23.     try:
  24.         connection = mysql.connector.connect(**db_config)
  25.         if connection.is_connected():
  26.             cursor = connection.cursor()
  27.             # 编写SQL查询,根据实际情况调整
  28.             query = "SELECT username, password,name FROM users WHERE username = %s AND password = %s"
  29.             cursor.execute(query, (username,password))
  30.             result = cursor.fetchone()
  31.             # 如果用户名存在且密码匹配,则返回True
  32.             if result :
  33.                 return True, result[0],result[2]  # 返回True和用户名
  34.             else:
  35.                 return False, None,None
  36.     except Error as e:
  37.         st.write(f"Database error: {e}")
  38.     finally:
  39.         if connection.is_connected():
  40.             connection.close()
  41.     return False, None,None

  42. # 初始化session状态,用于跟踪用户认证状态和当前登录用户
  43. if "auth_status" not in st.session_state:
  44.     st.session_state["auth_status"] = 1  # 默认为未认证状态

  45. auth_status = st.session_state["auth_status"] # 获取当前认证状态

  46. if "auth_user" not in st.session_state: # 如果没有设置当前用户,则默认为"系统"
  47.     st.session_state["auth_user"] = "系统"
  48. name = st.session_state["auth_user"]  # 获取当前登录用户名

  49. # 用户登录逻辑
  50. if auth_status == 1:
  51.     st.sidebar.title("用户登录") # 设置侧边栏标题

  52.     # 在侧边栏添加用户名和密码输入框
  53.     username = st.sidebar.text_input("用户名")
  54.     password = st.sidebar.text_input("密码", type="password")

  55.     # 登录按钮的事件处理
  56.     if st.sidebar.button("登录"):
  57.         login_success, user_name,user_full_name = authenticate_user(username, password)
  58.         if login_success:
  59.             st.success("登录成功!") # 显示登录成功消息
  60.             st.session_state["auth_status"] = 2 # 更新认证状态为已认证
  61.             st.session_state["auth_user"] = user_name # 更新当前用户
  62.             user_tag = sac.Tag(user_full_name)  # 使用用户姓名作为tag
  63.             st.rerun() # 重新运行应用以刷新界面
  64.         else:
  65.             st.error("用户名或密码错误!") # 显示错误消息
  66.             st.session_state["auth_status"] = 1 # 重置认证状态
  67.                
  68. # 用户已登录,显示侧边栏菜单
  69. if auth_status == 2:
  70.     name = st.session_state["auth_user"]
  71.     with st.sidebar.container():
  72.         # 创建标签
  73.         user_tag = sac.Tag(name, color='orange', bordered=False)
  74.         quit = sac.Tag('注销', color='red', bordered=False)
  75.   
  76.         # 目录
  77.         menu = sac.menu(
  78.             items=[
  79.                 sac.MenuItem('当前登陆', icon="list",disabled=True, tag=user_tag),
  80.                 sac.MenuItem('主页', icon="house-fill"),
  81.                 sac.MenuItem('Dashboard', icon="speedometer"),  
  82.                 sac.MenuItem('图例', icon='pie-chart', type='divider', children=[
  83.                     sac.MenuItem('柱形图', icon='1-circle'),
  84.                     sac.MenuItem('仪表盘', icon='2-circle'),
  85.                 ]),
  86.                 sac.MenuItem('退出登录', icon="x-circle-fill",tag=quit),        
  87.                 #sac.MenuItem(type="divider"),            
  88.                 sac.MenuItem('相关库',icon='megaphone',type='group', children=[
  89.                     sac.MenuItem('StreamlitAntd', icon='github', disabled=False, href='https://nicedouble-streamlitantdcomponentsdemo-app-middmy.streamlit.app/'),
  90.                     sac.MenuItem('Echarts', icon='globe-central-south-asia',disabled=False, href='https://echarts.apache.org/examples/zh/index.html#chart-type-line'),
  91.                     sac.MenuItem('Pyecharts', icon='minecart-loaded', disabled=False, href='https://pyecharts.org/#/zh-cn/intro')                    
  92.                 ])
  93.             ],
  94.             index=1,
  95.             key='menu',
  96.             open_all=False, indent=20,
  97.             format_func='title'
  98.         )

  99.         #sac.divider('作者公众号',icon='envelope')
  100.         #st.image('D:/houtu1.png',width=100)

  101.     if menu == '主页':
  102.         st.write("你自己的界面!!!")

  103.     elif menu == '退出登录':
  104.         with st.spinner("加载中……"):
  105.             st.session_state["auth_status"] = 1
  106.             st.rerun()
  107.             
复制代码


图片红框中的admin 是数据库表中字段username数据,但我希望显示的是字段name的数据- 管理员,在代码中 我其实也定义了的 user_tag = sac.Tag(user_full_name)  # 指定name赋值给user_tag ,但程序运行后还是不行,不知道哪里出错了?求助各位老师和大侠,谢谢!附件为mysql数据库
3.png

框中的admin 我希望显示的是管理员

框中的admin 我希望显示的是管理员

Dump20240625.zip

1.06 KB, 下载次数: 1

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-6-27 18:33:01 | 显示全部楼层
本帖最后由 阿奇_o 于 2024-6-27 18:34 编辑

解决:
  1.     # 登录按钮的事件处理
  2.     if st.sidebar.button("登录"):
  3.         login_success, user_name, user_fullname = authenticate_user(username, password)
  4.         if login_success:
  5.             st.success("登录成功!") # 显示登录成功消息
  6.             st.session_state["auth_status"] = 2 # 更新认证状态为已认证
  7.             st.session_state["auth_user"] = user_name # 更新当前用户
  8.             # user_tag = sac.Tag(user_fullname)  # 使用用户姓名作为tag  (错误!!因为会被)
  9.             # 正确做法:可以保存到会话状态里(以供后面“已登录”的状态下使用)
  10.             st.session_state['user_fullname'] = user_fullname  
  11.             st.rerun() # 重新运行应用以刷新界面(进入到“已登录”的状态)

  12. # 用户已登录,显示侧边栏菜单
  13. if auth_status == 2:
  14.     name = st.session_state["auth_user"]
  15.     user_fullname = st.session_state['user_fullname']
  16.     with st.sidebar.container():
  17.         # 创建标签
  18.         # user_tag = sac.Tag(name, color='orange', bordered=False)
  19.         user_tag = sac.Tag(user_fullname, color='orange', bordered=False)
  20.         quit = sac.Tag('注销', color='red', bordered=False)
复制代码

ps: 小问题:connection的作用域,要改一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-6-28 10:13:58 | 显示全部楼层
来了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2024-6-29 18:30:51 | 显示全部楼层
阿奇_o 发表于 2024-6-27 18:33
解决:

ps: 小问题:connection的作用域,要改一下。

谢谢你的思路,把st.session_state["auth_user"] = user_name 改成st.session_state["auth_user"] = user_full_name就行了。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-21 15:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表