如何在Django中创建两类不同权限的后台管理用户?
Django 自动创建超级用户与维护用户的实现方案
核心思路
- 超级用户:复用Django自带
User模型的is_superuser属性,通过post_migrate信号在系统初始化(执行migrate)时自动创建,省去手动执行createsuperuser命令的步骤。 - 维护用户:先创建专属权限组(如
Maintenance),给组分配系统维护相关权限,再创建属于该组的用户,同样通过信号自动完成,确保用户拥有指定维护权限且能登录后台。 - 防重复创建:每次触发信号时先检查用户/组是否存在,避免重复生成。
具体实现代码
1. 创建信号处理文件
在你的Django项目任意app下(比如myapp)新建signals.py文件,写入以下代码:
from django.db.models.signals import post_migrate from django.dispatch import receiver from django.contrib.auth.models import User, Group, Permission import os # -------------------------- 创建超级用户 -------------------------- @receiver(post_migrate) def auto_create_superuser(sender, **kwargs): # 仅在指定app的migrate完成后触发(替换成你的app名称,比如'myapp') if kwargs['app_config'].name != 'myapp': return # 从环境变量读取配置,避免硬编码(推荐),无环境变量则用默认值 su_username = os.getenv('SU_USERNAME', 'admin') su_email = os.getenv('SU_EMAIL', 'admin@example.com') su_password = os.getenv('SU_PASSWORD', 'Admin@123') if not User.objects.filter(username=su_username).exists(): User.objects.create_superuser( username=su_username, email=su_email, password=su_password ) print(f"超级用户 {su_username} 创建成功") # -------------------------- 创建维护用户与权限组 -------------------------- @receiver(post_migrate) def auto_create_maintenance_user(sender, **kwargs): if kwargs['app_config'].name != 'myapp': return # 1. 创建维护权限组 maintenance_group, _ = Group.objects.get_or_create(name='Maintenance') # 2. 给组分配维护相关权限(根据你的需求调整) # 权限的codename可从Django后台的"权限"列表中查看 required_permissions = [ 'view_user', # 查看用户列表 'view_logentry', # 查看操作日志 'change_site', # 修改站点设置 'view_permission', # 查看权限列表 # 可添加自定义app权限,比如'myapp_view_maintenance_log' ] for perm_codename in required_permissions: try: perm = Permission.objects.get(codename=perm_codename) maintenance_group.permissions.add(perm) except Permission.DoesNotExist: print(f"权限 {perm_codename} 不存在,跳过分配") # 3. 创建维护用户 mu_username = os.getenv('MU_USERNAME', 'maintainer') mu_email = os.getenv('MU_EMAIL', 'maintainer@example.com') mu_password = os.getenv('MU_PASSWORD', 'Maintain@123') if not User.objects.filter(username=mu_username).exists(): maintenance_user = User.objects.create_user( username=mu_username, email=mu_email, password=mu_password, is_staff=True # 必须设为True才能登录Django后台 ) maintenance_user.groups.add(maintenance_group) maintenance_user.save() print(f"维护用户 {mu_username} 创建成功")
2. 注册信号
打开该app下的apps.py文件,修改ready()方法导入信号:
from django.apps import AppConfig class MyappConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'myapp' def ready(self): # 导入信号模块,让Django加载信号 import myapp.signals
3. 配置环境变量(可选但推荐)
在项目根目录新建.env文件,存放敏感信息:
SU_USERNAME=admin SU_EMAIL=admin@yourdomain.com SU_PASSWORD=YourStrongSuperPassword! MU_USERNAME=maintainer MU_EMAIL=maintainer@yourdomain.com MU_PASSWORD=YourStrongMaintainPassword!
记得在settings.py中加载环境变量(需安装python-dotenv包:pip install python-dotenv):
from dotenv import load_dotenv import os load_dotenv() # 加载.env文件
运行验证
执行以下命令完成数据库迁移,信号会自动触发创建用户:
python manage.py migrate
之后登录Django后台(/admin),分别用超级用户和维护用户登录,验证权限是否符合预期。
注意事项
- 维护用户必须设置
is_staff=True,否则无法登录后台。 - 权限列表可根据实际维护需求增减,比如不需要修改站点设置就去掉
change_site。 - 生产环境禁止硬编码密码,务必使用环境变量或安全配置方式。
- 修改用户信息直接在Django后台操作即可,无需重新执行
migrate。
内容的提问来源于stack exchange,提问作者user23877373
相关产品推荐
相关产品推荐

