一、数据库的必要性
一些个人项目最开始会把用户写死在代码里或存成 txt 文件,这会带来几个问题:
-
数据无法结构化查询
-
无法防止重复用户名
-
扩展困难
SQLite 是一个轻量级嵌入式数据库,非常适合个人项目和小型系统。
二、数据库的管理
使用 python 脚本可以方便地实现数据库的管理。
1.初始化
import sqlite3
import os
from werkzeug.security import generate_password_hash
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DB_PATH = os.path.join(BASE_DIR, "blog.db")
def get_connection():
return sqlite3.connect(DB_PATH)
def init_db():
conn = get_connection()
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password TEXT NOT NULL,
role TEXT NOT NULL DEFAULT 'user',
is_active INTEGER NOT NULL DEFAULT 1
);
""")
conn.commit()
conn.close()
2.添加用户(使用密码哈希)
def add_user(username, password, role="user"):
conn = get_connection()
cursor = conn.cursor()
cursor.execute(
"SELECT id FROM users WHERE username = ?",
(username,)
)
if cursor.fetchone():
print("用户已存在")
conn.close()
return
hashed = generate_password_hash(password)
cursor.execute(
"INSERT INTO users (username, password, role) VALUES (?, ?, ?)",
(username, hashed, role)
)
conn.commit()
conn.close()
3.登录验证
from werkzeug.security import check_password_hash
def authenticate(username, password):
conn = get_connection()
cursor = conn.cursor()
cursor.execute(
"SELECT password FROM users WHERE username = ? AND is_active = 1",
(username,)
)
row = cursor.fetchone()
conn.close()
if not row:
return False
stored_hash = row[0]
return check_password_hash(stored_hash, password)
4.删除用户(软删除)
def deactivate_user(username):
conn = get_connection()
cursor = conn.cursor()
cursor.execute(
"UPDATE users SET is_active = 0 WHERE username = ?",
(username,)
)
conn.commit()
conn.close()
5.修改密码
def update_password(username, new_password):
conn = get_connection()
cursor = conn.cursor()
hashed = generate_password_hash(new_password)
cursor.execute(
"UPDATE users SET password = ? WHERE username = ?",
(hashed, username)
)
conn.commit()
conn.close()
6.运行的脚本
def main():
init_db()
while True:
print("\n1. 添加用户")
print("2. 删除用户")
print("3. 修改密码")
print("4. 退出")
choice = input("选择操作:").strip()
if choice == "1":
u = input("用户名:")
p = input("密码:")
add_user(u, p)
elif choice == "2":
u = input("用户名:")
deactivate_user(u)
elif choice == "3":
u = input("用户名:")
p = input("新密码:")
update_password(u, p)
elif choice == "4":
break
if __name__ == "__main__":
main()
三、关于哈希
哈希(Hashing)是一种将任意长度的数据转换为固定长度输出的单向函数,这个输出值被称为哈希值(Hash Value)或哈希摘要(Hash Digest)。
在密码存储中,哈希函数用于将用户设置的密码转换为哈希值存储在数据库中。当用户登录输入密码时,系统会对输入的密码进行相同的哈希计算,然后将计算得到的哈希值与数据库中存储的哈希值进行比对,如果两者一致,则说明密码正确。