dash SQLite 留言本应用技术实现说明
1. 技术选型
1.1 Web 框架
- Dash:基于 Flask 的交互式 Web 应用框架
- 优点:
- 快速构建数据驱动的 Web 应用
- 支持实时交互和回调
- 与 Python 数据科学生态无缝集成
1.2 UI 组件库
- Dash Bootstrap Components
- 目的:快速构建响应式、美观的用户界面
- 特点:
- 提供现成的 Bootstrap 样式组件
- 移动端友好
- 简化 UI 开发流程
1.3 数据持久化
- SQLAlchemy ORM:Python 的 SQL 工具包和对象关系映射(ORM)库
- SQLite:轻量级嵌入式关系型数据库
- 优势:
- 无需额外数据库服务器
- 文件级存储
- 适合小型应用和原型开发
2. 系统架构
2.1 数据模型
class Message(Base):
id: 唯一标识
name: 发言人名字
content: 消息内容
timestamp: 发送时间
2.2 核心功能
- 消息添加
- 消息列表展示
- 实时刷新
2.3 关键技术点
- 使用 SQLAlchemy 的 ORM 进行数据库操作
- Dash 回调机制实现交互
- 定时器组件实现消息自动刷新
3. 性能与扩展性
3.1 性能考虑
- SQLite 适合并发较低的场景
- 5秒定时刷新避免过于频繁的数据库查询
3.2 潜在优化方向
4. 部署注意事项
- 推荐使用 Python 虚拟环境
- 生产环境可考虑使用 Gunicorn 或 uWSGI
- 建议配置反向代理(如 Nginx)
5. 安全性建议
6. 技术栈总结
- Web 框架:Dash
- UI 库:Dash Bootstrap Components
- 数据库:SQLite
- ORM:SQLAlchemy
- 语言:Python 3.8+
7. 开发与运行
pip install -r requirements.txt
python app.py
import dash
import dash_bootstrap_components as dbc
from dash import html, dcc, Input, Output, State
from sqlalchemy import create_engine, Column, Integer, String, DateTime
from sqlalchemy.orm import sessionmaker, declarative_base
from sqlalchemy.sql import func
import datetime
DATABASE_URL = 'sqlite:///messages.db'
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(bind=engine)
Base = declarative_base()
class Message(Base):
__tablename__ = 'messages'
id = Column(Integer, primary_key=True, index=True)
name = Column(String, index=True)
content = Column(String)
timestamp = Column(DateTime, server_default=func.now())
Base.metadata.create_all(bind=engine)
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
def get_all_messages():
"""
获取所有留言消息
按时间戳降序排序,最新消息在前
"""
db = SessionLocal()
try:
messages = db.query(Message).order_by(Message.timestamp.desc()).all()
return messages
finally:
db.close()
def add_message(name, content):
"""
添加新的留言消息
参数:
- name: 发言人名字
- content: 消息内容
"""
db = SessionLocal()
try:
new_message = Message(name=name, content=content)
db.add(new_message)
db.commit()
finally:
db.close()
app.layout = dbc.Container([
html.H1("SQLite 留言本", className="text-center my-4"),
dbc.Row([
dbc.Col([
dbc.Label("你的名字"),
dbc.Input(id='name-input', type='text', placeholder='请输入你的名字')
], width=6),
], className="mb-3"),
dbc.Row([
dbc.Col([
dbc.Label("留言内容"),
dbc.Textarea(id='message-input', placeholder='请输入你的留言', rows=4)
], width=12),
], className="mb-3"),
dbc.Row([
dbc.Col([
dbc.Button("提交留言", id='submit-button', color='primary')
])
], className="mb-3"),
html.Div(id='message-output', className="mt-4"),
dcc.Interval(id='interval-component', interval=5*1000, n_intervals=0)
])
@app.callback(
[Output('message-output', 'children'),
Output('name-input', 'value'),
Output('message-input', 'value')],
[Input('submit-button', 'n_clicks'),
Input('interval-component', 'n_intervals')],
[State('name-input', 'value'),
State('message-input', 'value')]
)
def update_messages(n_clicks, n_intervals, name, message):
"""
更新消息列表的回调函数
处理消息提交和定期刷新
"""
ctx = dash.callback_context
trigger_id = ctx.triggered[0]['prop_id'].split('.')[0]
if trigger_id == 'submit-button' and n_clicks and name and message:
add_message(name, message)
messages = get_all_messages()
message_list = [
dbc.ListGroupItem(
f"{msg.name} 说:{msg.content} (于 {msg.timestamp.strftime('%Y-%m-%d %H:%M:%S')})",
key=msg.id
) for msg in messages
]
return [
dbc.ListGroup(message_list),
'' if trigger_id == 'submit-button' else dash.no_update,
'' if trigger_id == 'submit-button' else dash.no_update
]
if __name__ == '__main__':
app.run_server(debug=True)