#!/usr/bin/env python
|
"""
|
首次部署初始化脚本
|
|
该脚本用于首次部署系统时执行所有必要的初始化操作,包括:
|
1. 检查数据库连接
|
2. 执行数据库迁移
|
3. 创建管理员用户
|
4. 创建默认用户组
|
5. 收集静态文件
|
|
使用方法:
|
python add_status_field.py --init
|
|
或者使用 Django 标准命令:
|
python manage.py makemigrations
|
python manage.py migrate
|
python manage.py createsuperuser
|
"""
|
|
import os
|
import sys
|
import django
|
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'backend.settings')
|
django.setup()
|
|
from django.core.management import call_command
|
from django.contrib.auth import get_user_model
|
from django.contrib.auth.models import Group
|
|
|
def check_database_connection():
|
"""
|
检查数据库连接
|
"""
|
print("=" * 60)
|
print("检查数据库连接...")
|
print("=" * 60)
|
|
try:
|
from django.db import connection
|
with connection.cursor() as cursor:
|
cursor.execute("SELECT 1")
|
print("✓ 数据库连接正常")
|
return True
|
except Exception as e:
|
print(f"✗ 数据库连接失败: {e}")
|
print("\n请检查 conf/env.py 中的数据库配置")
|
return False
|
|
|
def run_migrations():
|
"""
|
执行数据库迁移
|
"""
|
print("\n" + "=" * 60)
|
print("执行数据库迁移...")
|
print("=" * 60)
|
|
try:
|
print("\n[1/2] 生成迁移文件...")
|
call_command('makemigrations', verbosity=1)
|
print("✓ 迁移文件生成成功")
|
|
print("\n[2/2] 应用迁移...")
|
call_command('migrate', verbosity=1)
|
print("✓ 数据库迁移成功")
|
return True
|
|
except Exception as e:
|
print(f"✗ 数据库迁移失败: {e}")
|
import traceback
|
traceback.print_exc()
|
return False
|
|
|
def create_admin_user(username='admin', password='admin123', email='admin@example.com', name='系统管理员'):
|
"""
|
创建管理员用户
|
"""
|
print("\n" + "=" * 60)
|
print("创建管理员用户...")
|
print("=" * 60)
|
|
User = get_user_model()
|
|
try:
|
user = User.objects.get(username=username)
|
print(f"管理员用户 '{username}' 已存在,跳过创建")
|
print(f" 用户名: {user.username}")
|
print(f" 姓名: {user.name}")
|
print(f" 邮箱: {user.email}")
|
return True
|
|
except User.DoesNotExist:
|
try:
|
user = User.objects.create_superuser(
|
username=username,
|
email=email,
|
password=password
|
)
|
user.name = name
|
user.phone = None
|
user.show_hosts = False
|
user.status = 'approved'
|
user.save()
|
|
print("✓ 管理员用户创建成功")
|
print(f" 用户名: {username}")
|
print(f" 密码: {password}")
|
print(f" 邮箱: {email}")
|
print(f" 姓名: {name}")
|
print("\n⚠️ 重要提示: 请在首次登录后修改默认密码!")
|
return True
|
|
except Exception as e:
|
print(f"✗ 创建管理员用户失败: {e}")
|
import traceback
|
traceback.print_exc()
|
return False
|
|
|
def create_default_groups():
|
"""
|
创建默认用户组
|
"""
|
print("\n" + "=" * 60)
|
print("创建默认用户组...")
|
print("=" * 60)
|
|
groups = [
|
{'name': '管理员组', 'description': '拥有所有权限的管理员组'},
|
{'name': '开发人员组', 'description': '开发人员组'},
|
{'name': '测试人员组', 'description': '测试人员组'},
|
{'name': '只读用户组', 'description': '只读用户组'},
|
]
|
|
created_count = 0
|
for group_info in groups:
|
try:
|
Group.objects.get(name=group_info['name'])
|
print(f" 用户组 '{group_info['name']}' 已存在")
|
except Group.DoesNotExist:
|
try:
|
Group.objects.create(name=group_info['name'])
|
print(f" ✓ 创建用户组: {group_info['name']}")
|
created_count += 1
|
except Exception as e:
|
print(f" ✗ 创建用户组 '{group_info['name']}' 失败: {e}")
|
|
print(f"\n✓ 成功创建 {created_count} 个用户组")
|
return True
|
|
|
def collect_static_files():
|
"""
|
收集静态文件
|
"""
|
print("\n" + "=" * 60)
|
print("收集静态文件...")
|
print("=" * 60)
|
|
try:
|
call_command('collectstatic', '--noinput', verbosity=1)
|
print("✓ 静态文件收集成功")
|
return True
|
|
except Exception as e:
|
print(f"✗ 静态文件收集失败: {e}")
|
import traceback
|
traceback.print_exc()
|
return False
|
|
|
def display_summary():
|
"""
|
显示部署摘要
|
"""
|
print("\n" + "=" * 60)
|
print("部署摘要")
|
print("=" * 60)
|
|
User = get_user_model()
|
|
print(f"\n用户数量: {User.objects.count()}")
|
print(f"用户组数量: {Group.objects.count()}")
|
|
print("\n默认管理员账号:")
|
print(" 用户名: admin")
|
print(" 密码: admin123")
|
print("\n⚠️ 请在首次登录后立即修改默认密码!")
|
|
|
def main():
|
"""
|
主函数
|
"""
|
import argparse
|
|
parser = argparse.ArgumentParser(description='首次部署初始化脚本')
|
parser.add_argument('--init', action='store_true', help='执行完整的初始化流程')
|
parser.add_argument('--migrate', action='store_true', help='仅执行数据库迁移')
|
parser.add_argument('--create-admin', action='store_true', help='仅创建管理员用户')
|
parser.add_argument('--create-groups', action='store_true', help='仅创建用户组')
|
parser.add_argument('--collect-static', action='store_true', help='仅收集静态文件')
|
|
args = parser.parse_args()
|
|
if args.init:
|
print("\n")
|
print("╔" + "=" * 58 + "╗")
|
print("║" + " " * 10 + "接口自动化平台 - 首次部署初始化" + " " * 13 + "║")
|
print("╚" + "=" * 58 + "╝")
|
print()
|
|
steps = [
|
("检查数据库连接", check_database_connection),
|
("执行数据库迁移", run_migrations),
|
("创建管理员用户", create_admin_user),
|
("创建默认用户组", create_default_groups),
|
("收集静态文件", collect_static_files),
|
]
|
|
failed_steps = []
|
|
for step_name, step_func in steps:
|
if not step_func():
|
failed_steps.append(step_name)
|
print(f"\n✗ '{step_name}' 失败,终止部署")
|
break
|
|
if not failed_steps:
|
display_summary()
|
print("\n" + "=" * 60)
|
print("✓ 部署初始化完成!")
|
print("=" * 60)
|
print("\n系统已准备就绪,可以启动服务:")
|
print(" python manage.py runserver")
|
print()
|
return 0
|
else:
|
print("\n" + "=" * 60)
|
print("✗ 部署初始化失败!")
|
print("=" * 60)
|
print(f"\n失败的步骤: {', '.join(failed_steps)}")
|
return 1
|
|
elif args.migrate:
|
return 0 if run_migrations() else 1
|
|
elif args.create_admin:
|
return 0 if create_admin_user() else 1
|
|
elif args.create_groups:
|
return 0 if create_default_groups() else 1
|
|
elif args.collect_static:
|
return 0 if collect_static_files() else 1
|
|
else:
|
parser.print_help()
|
print("\n使用示例:")
|
print(" python add_status_field.py --init # 完整初始化")
|
print(" python add_status_field.py --migrate # 仅迁移数据库")
|
print(" python add_status_field.py --create-admin # 仅创建管理员")
|
print("\n或使用 Django 标准命令:")
|
print(" python manage.py makemigrations")
|
print(" python manage.py migrate")
|
print(" python manage.py createsuperuser")
|
return 0
|
|
|
if __name__ == '__main__':
|
sys.exit(main())
|