Google Cloud部署的Django应用无法通过Admin后台手动创建用户认证令牌
问题背景
你在Google Cloud App Engine上部署了基于Django框架+DRF的用户账号系统,本地测试一切正常,但在生产环境中通过Django Admin后台为用户手动生成认证令牌时,出现了500错误,错误日志显示核心问题是数据库中缺少authtoken_token表。
为什么会出现这个问题?
DRF的rest_framework.authtoken依赖一个名为authtoken_token的数据库表来存储用户令牌,这个表是通过Django的迁移命令创建的。本地测试时你应该已经执行过migrate命令生成了这个表,但生产环境的Google Cloud SQL数据库并没有同步执行这些迁移操作,导致Admin后台访问时找不到对应表,触发500错误。
具体解决步骤
1. 确认迁移文件存在
首先,rest_framework.authtoken作为第三方应用,自带了迁移文件,不需要你手动编写。但要确保你的项目已经包含了这些迁移的记录,本地可以先运行:
python manage.py showmigrations authtoken
如果输出里有未应用的迁移,说明需要推送到生产环境执行。
2. 在GAE生产环境执行数据库迁移
有两种常用方式可以完成这个操作:
方式一:通过Cloud Shell直接执行
- 打开Google Cloud Console的Cloud Shell,切换到你的项目代码目录(如果是通过Git拉取的,先确保代码是最新版本)。
- 进入App Engine的交互式shell:
gcloud app shell - 在shell中执行迁移命令:
python manage.py migrate
方式二:部署时自动执行迁移
你可以修改app.yaml文件,让GAE在启动应用前自动执行迁移,避免每次手动操作:
runtime: python39 # 修改entrypoint,先执行迁移再启动服务 entrypoint: bash -c "python manage.py migrate --noinput && gunicorn -b :$PORT DjangoServer.wsgi:application --preload" handlers: - url: /static static_dir: static/ - url: /.* script: auto
然后重新部署应用:
gcloud app deploy
--noinput参数是为了在生产环境避免交互式确认,确保迁移自动完成。
3. 验证修复效果
迁移完成后,重新登录Django Admin后台,尝试为用户生成认证令牌,应该不会再出现500错误。你也可以通过Google Cloud Console的Cloud SQL面板,查看数据库中是否已经存在authtoken_token表,确认迁移成功。
额外提醒
- 确保你的GAE服务账号拥有Cloud SQL的读写权限,否则迁移时可能会出现权限错误。
- 后续每次更新Django模型、添加新的第三方应用后,都要记得在生产环境执行
migrate命令,保持数据库结构同步。 - 生产环境建议使用
--noinput参数执行迁移,避免因交互式操作导致部署失败。
内容的提问来源于stack exchange,提问作者Rodrigo Alberto Guerrero Bermúdez

