Kamixitong/reset_admin_password.py
2025-11-22 20:32:49 +08:00

84 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
重置管理员密码脚本
用于解决密码哈希兼容性问题
"""
import sys
import os
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
# 尝试加载.env文件在导入app之前确保环境变量生效
try:
from dotenv import load_dotenv
env_loaded = load_dotenv()
if env_loaded:
print("成功加载.env文件")
else:
print("未找到或无法加载.env文件将使用默认配置")
except ImportError:
print("python-dotenv未安装跳过.env文件加载")
from app import create_app, db
from app.models.admin import Admin
from werkzeug.security import generate_password_hash
def reset_admin_password(username='admin', new_password='admin123'):
"""重置管理员密码"""
# 检测环境配置
config_name = os.environ.get('FLASK_CONFIG', 'production')
# 检查数据库配置
database_url = os.environ.get('DATABASE_URL', '')
if database_url:
print(f"使用数据库: {database_url.split('@')[-1] if '@' in database_url else database_url[:50]}...")
else:
print("警告: 未设置 DATABASE_URL 环境变量,将使用默认配置")
# 使用生产环境配置
app = create_app(config_name)
with app.app_context():
# 查找管理员用户(排除已删除的)
admin = Admin.query.filter_by(username=username, is_deleted=0).first()
if not admin:
print(f"错误: 用户 '{username}' 不存在或已被删除")
return False
try:
# 重新设置密码(使用新格式)
admin.set_password(new_password)
db.session.commit()
print(f"成功: 用户 '{username}' 的密码已重置为: {new_password}")
print(f"新的密码哈希格式: {admin.password_hash[:50]}...")
return True
except Exception as e:
db.session.rollback()
print(f"错误: 重置密码失败 - {str(e)}")
import traceback
traceback.print_exc()
return False
if __name__ == '__main__':
# 支持命令行参数或交互式输入
if len(sys.argv) > 1:
# 命令行参数方式
username = sys.argv[1]
new_password = sys.argv[2] if len(sys.argv) > 2 else 'admin123'
else:
# 交互式输入方式
username = input("请输入要重置的用户名 (默认: admin): ").strip() or 'admin'
new_password = input("请输入新密码 (默认: admin123): ").strip() or 'admin123'
print(f"正在重置用户 '{username}' 的密码...")
success = reset_admin_password(username, new_password)
if success:
print("密码重置完成!现在可以使用新密码登录了。")
else:
print("密码重置失败,请检查错误信息。")
sys.exit(0 if success else 1)