Heroku上Django应用新用户无法持久化至MySQL数据库求助
问题描述
我们在Heroku上部署了一个Django项目,发现通过django.contrib.auth.models.User的User.objects.create_user()创建的新用户无法持久化到MySQL数据库的Django User表中,但Django的管理员用户却可以正常持久化。现附上相关代码片段,寻求排查建议:
更新1(2023-04-04)
代码片段
views.py
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login, logout from django.contrib.auth.models import User ...code... def insertUser(request): ...code... # 用户名验证 if User.objects.filter(username=request.POST['name']).exists(): data['msg'] = '用户已注册!' data['class'] = 'alert-danger' return render(request, 'cadUser.html', data) # 邮箱验证 if User.objects.filter(email=request.POST['email']).exists(): data['msg'] = '邮箱已注册!' data['class'] = 'alert-danger' return render(request, 'cadUser.html', data) # 功能注册验证 # 新用户记录 user = User.objects.create_user(request.POST['name'], request.POST['email'], request.POST['password']) Docente.reg_funcional = request.POST['reg_funcional'] #user.reg_funcional = request.POST['reg_funcional'] user.save() data['msg'] = '用户注册成功!' data['class'] = 'alert-success' return render(request, 'loginUser.html', data)
settings.py
from pathlib import Path import django_on_heroku ...settings... INSTALLED_APPS = [ <our stuff>, 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_simple_cookie_consent', ] ...settings... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', <connection stuff> } } AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] ...settings... django_on_heroku.settings(locals())
排查建议
- 修复
Docente模型的错误赋值:代码中Docente.reg_funcional = request.POST['reg_funcional']是直接给类属性赋值,而非创建关联新用户的Docente实例,这会导致无效操作,甚至触发未捕获异常引发事务回滚,让用户数据无法保存。正确写法应为创建实例,比如:
若Docente.objects.create(user=user, reg_funcional=request.POST['reg_funcional'])Docente是User的扩展模型,需确认关联逻辑是否正确。 - 添加异常捕获排查错误:在
insertUser视图中加入异常捕获,打印或记录错误信息,确认是否有数据库操作异常导致回滚。示例:try: user = User.objects.create_user(request.POST['name'], request.POST['email'], request.POST['password']) # 正确的Docente实例创建代码 # ... except Exception as e: print(f"创建用户出错: {e}") # 返回错误提示给前端 - 验证Heroku数据库配置:
django_on_heroku.settings(locals())会自动读取环境变量DATABASE_URL并覆盖DATABASES配置,需确认该环境变量指向的是正确的MySQL实例,且数据库用户拥有读写权限。 - 查看Heroku应用日志:执行
heroku logs --tail实时查看日志,搜索数据库相关错误,比如字段约束冲突、连接超时、权限不足等信息。 - 移除多余的
user.save():User.objects.create_user()内部已调用save(),重复调用虽无错误,但可移除避免潜在问题。 - 检查表单数据合法性:确认
request.POST中的name、email、password符合数据库字段要求,比如username长度不超过150字符、email格式正确、password符合密码验证规则。
内容的提问来源于stack exchange,提问作者HufflepuffBR
相关产品推荐
相关产品推荐

