You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:05:33