部署在App Engine的Django应用登录时出现只读数据库写入错误
嘿,这个坑我踩过!咱们直接说核心问题:App Engine标准环境的文件系统是完全只读的,而你现在用的SQLite数据库是把数据存在本地的db.sqlite3文件里——登录操作需要写入数据库(比如创建用户会话、更新登录状态),但App Engine不允许修改本地文件,所以就触发了这个只读错误。
为什么其他功能正常?
那些功能大概率只是做了读取数据库的操作(比如展示内容),不需要写入本地文件,所以没触发限制;而登录涉及写入,直接撞在了只读文件系统的规则上。
怎么解决?
必须换掉SQLite,改用支持云端写入的数据库,Google官方推荐用Cloud SQL(适配App Engine的托管数据库服务),步骤如下:
创建Cloud SQL实例
选MySQL或者PostgreSQL都可以(Django对两者都有很好的支持),记住实例的项目ID、区域、数据库名、用户名和密码。修改settings.py的数据库配置
删掉原来的SQLite配置,换成对应数据库的配置:- 如果你选MySQL:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': f'/cloudsql/{os.environ.get('CLOUD_SQL_CONNECTION_NAME')}', 'PORT': '3306', } } - 如果你选PostgreSQL:
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': os.environ.get('DB_NAME'), 'USER': os.environ.get('DB_USER'), 'PASSWORD': os.environ.get('DB_PASSWORD'), 'HOST': f'/cloudsql/{os.environ.get('CLOUD_SQL_CONNECTION_NAME')}', 'PORT': '5432', } }
(建议用环境变量存敏感信息,不要硬编码在settings里)
- 如果你选MySQL:
添加数据库驱动到requirements.txt
- MySQL需要加:
mysqlclient==2.2.0 - PostgreSQL需要加:
psycopg2-binary==2.9.9
- MySQL需要加:
配置Cloud SQL访问权限
确保App Engine的服务账号有Cloud SQL Client的权限,这样你的应用才能连接到Cloud SQL实例。部署前初始化数据库
本地或者用Cloud Shell跑python manage.py migrate,把Django的表结构同步到Cloud SQL里。
额外提醒
你原来SQLite配置里的USER和PASSWORD参数是没用的——SQLite本身不需要用户名密码验证,这些配置项会被忽略,以后不用加啦。
内容的提问来源于stack exchange,提问作者russianmax

