如何将Django的用户注册登录信息写入PostgreSQL数据表
实现用户注册/登录信息写入PostgreSQL的实操步骤
1. 先创建用户信息存储表
首先需要在PostgreSQL中设计符合业务需求的用户表,核心字段要覆盖用户身份标识、密码存储、时间戳三类信息,绝对禁止存储明文密码,所有密码必须先做哈希加密再入库。
参考建表SQL:
CREATE TABLE users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP );
2. 注册场景下的数据写入逻辑
首先需要在服务端引入对应语言的PostgreSQL驱动(Python用psycopg2、Node.js用pg、Java用JDBC等),所有数据库操作都要使用参数化查询,避免SQL注入风险。
以Python为例的注册写入示例:
import psycopg2 import bcrypt # 初始化数据库连接 conn = psycopg2.connect( dbname="替换为你的数据库名", user="替换为你的数据库账号", password="替换为你的数据库密码", host="127.0.0.1", port="5432" ) cur = conn.cursor() def register(username, email, input_raw_password): # 先对用户输入的明文密码做哈希加密 salt = bcrypt.gensalt() encrypted_pwd = bcrypt.hashpw(input_raw_password.encode('utf-8'), salt) try: # 参数化写入用户数据 cur.execute( "INSERT INTO users (username, email, password_hash) VALUES (%s, %s, %s)", (username, email, encrypted_pwd.decode('utf-8')) ) conn.commit() return "注册成功" except psycopg2.IntegrityError: # 捕获唯一约束异常,处理用户名/邮箱重复的情况 conn.rollback() return "用户名或邮箱已被注册"
3. 登录场景下的数据读取&更新逻辑
登录时需要先校验用户身份,校验通过后更新最后登录时间:
def login(identity, input_raw_password): # 支持用户名/邮箱两种登录方式 cur.execute( "SELECT id, password_hash FROM users WHERE username = %s OR email = %s", (identity, identity) ) user_info = cur.fetchone() if not user_info: return "用户不存在" uid, stored_pwd_hash = user_info # 校验密码哈希是否匹配 if bcrypt.checkpw(input_raw_password.encode('utf-8'), stored_pwd_hash.encode('utf-8')): # 密码校验通过,更新最后登录时间 cur.execute("UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE id = %s", (uid,)) conn.commit() # 此处可补充生成登录态Token的逻辑 return "登录成功" return "密码错误"
核心注意事项
- 不要直接拼接SQL语句操作数据库,所有用户输入的内容都要通过参数化占位符传入,从根源避免SQL注入风险
- 密码哈希计算必须在服务端完成,不要交给前端处理
- 用户名、邮箱的唯一性校验建议同时在业务代码层和数据库唯一约束层做双重保障,避免并发请求产生重复数据
- 数据库连接、游标使用完成后要及时关闭,避免资源泄漏:
cur.close(); conn.close()
内容的提问来源于stack exchange,提问作者Louis Navex
相关产品推荐
相关产品推荐

