首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQLite 留言板實作:單頁面、倒序顯示、時間與 IP 記錄

     編輯:程式設計綜合問答

資料庫設計

CREATE TABLE messages (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    content TEXT NOT NULL,
    ip TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_messages_created_at ON messages(created_at DESC);

後端 (以 Python Flask 為例)

from flask import Flask, request, render_template_string, g
import sqlite3, os

app = Flask(__name__)
DB = 'messages.db'

def get_db():
    if 'db' not in g:
        g.db = sqlite3.connect(DB)
        g.db.row_factory = sqlite3.Row
    return g.db

@app.teardown_appcontext
def close_db(e=None):
    db = g.pop('db', None)
    if db: db.close()

def init_db():
    with app.app_context():
        db = get_db()
        db.executescript(open('schema.sql').read())
        db.commit()

HTML = """
<!doctype html>
<html><head><title>留言板</title>
<style>body{max-width:600px;margin:2rem auto;font-family:sans-serif}
.msg{border-bottom:1px solid #eee;padding:1rem 0}
.msg meta{color:#888;font-size:.9em}
form{display:flex;gap:.5rem;margin-bottom:2rem}
textarea{flex:1;min-height:80px}
button{padding:.5rem 1rem}
</style></head><body>
<h1>留言板</h1>
<form method=post>
  <textarea name=content placeholder="說點什麼..." required></textarea>
  <button type=submit>發布</button>
</form>
{% for m in messages %}
<div class=msg>
  <p>{{ m.content }}</p>
  <meta>IP: {{ m.ip }} | {{ m.created_at }}</meta>
</div>
{% endfor %}
</body></html>
"""

@app.route('/', methods=['GET', 'POST'])
def index():
    db = get_db()
    if request.method == 'POST':
        content = request.form['content'].strip()
        if content:
            ip = request.headers.get('X-Forwarded-For', request.remote_addr)
            db.execute('INSERT INTO messages (content, ip) VALUES (?, ?)', (content, ip))
            db.commit()
    # 倒序顯示
    cur = db.execute('SELECT content, ip, created_at FROM messages ORDER BY created_at DESC')
    messages = cur.fetchall()
    return render_template_string(HTML, messages=messages)

if __name__ == '__main__':
    if not os.path.exists(DB): init_db()
    app.run(debug=True)

關鍵點說明

  1. 單頁面: GET 顯示表單+列表,POST 插入後重導向同頁 (PRG 模式防重複提交)。
  2. 倒序: ORDER BY created_at DESC + 索引確保大量資料查詢快速。
  3. IP 取得: 考慮反向代理,優先讀 X-Forwarded-For 標頭。
  4. 防 XSS: 模板引擎 (Jinja2) 預設轉義 {{ m.content }},安全顯示使用者輸入。
  5. SQLite 並發: 適合低併發 (個人/小型專案);高併發建議改 PostgreSQL/MySQL + 連線池。

前端增強 (可選)

  • AJAX 提交 + 局部更新列表,避免整頁重整。
  • 分頁/無限滾動載入歷史留言。
  • Markdown 支援 (marked.js 前端渲染或後端 Python-Markdown)。
  • 簡單驗證碼/頻率限制防刷屏。

總結

SQLite 輕量零配置,極適合「單檔案、單頁面、低併發」留言板。核心邏輯:**建表含時間/IP 索引 → POST 插入 → GET 倒序查詢 → 模板渲染**。Python Flask 版本約 50 行即可完成功能,易於理解與擴充。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved